0Pricing
Competitive Programming Academy · 강의

다항식 문자열 해싱

상수 시간에 부분 문자열을 비교합니다

다항식 문자열 해싱은(는) CoddyKit의 무료 Competitive Programming Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Competitive Programming Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Competitive Programming Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

부분 문자열 빠르게 비교하기

두 부분 문자열이 같은지 확인해야 하는 경우가 많습니다. 문자를 하나씩 비교하면 느리므로 각 문자열을 하나의 숫자로 바꿉니다. 🔢

해시의 개념

해시는 문자열을 하나의 정수로 대응시킵니다. 두 문자열이 다르면 해시도 거의 항상 다릅니다.

문자열을 다항식으로 보기

각 문자를 p진법의 숫자로 봅니다. 이러한 다항식 관점은 문자열을 하나의 큰 가중 합으로 바꿉니다.

h = ord(s[0]) + ord(s[1]) * p + ord(s[2]) * p * p

밑과 모듈러 선택하기

31과 같은 소수 밑과 큰 소수 모듈러를 선택합니다. 모듈러 연산을 사용하면 숫자를 작게 유지하고 오버플로를 피할 수 있습니다.

BASE = 31
MOD = 10**9 + 9

해시 하나 계산하기

문자열을 순회하면서 호너의 법칙으로 각 문자를 차례로 합치고, 매 단계마다 모듈러 연산을 적용합니다.

h = 0
for c in s:
    h = (h * BASE + ord(c)) % MOD

접두사 해시

각 위치에 대한 접두사 해시를 저장합니다. 그러면 두 해시를 빠르게 뺄셈하여 어떤 부분 문자열의 해시도 구할 수 있습니다.

pre[i + 1] = (pre[i] * BASE + ord(s[i])) % MOD

밑의 거듭제곱

밑의 거듭제곱도 미리 계산합니다. 뺄셈할 때 두 접두사의 자릿수를 맞춰 주는 역할을 합니다.

pw[i] = (pw[i - 1] * BASE) % MOD

O(1)에 부분 문자열 해시 구하기

s[l..r]의 해시는 두 접두사 해시를 뺀 뒤 거듭제곱을 곱해 크기를 맞춘 값입니다. 질의 하나를 상수 시간에 처리할 수 있습니다.

def sub(l, r):
    return (pre[r] - pre[l] * pw[r - l]) % MOD

충돌을 주의하세요

서로 다른 두 문자열이 같은 해시를 가질 수 있으며, 이를 충돌이라고 합니다. 드문 일이지만, 대회에서는 때때로 충돌을 일으키도록 입력을 구성하기도 합니다.

안전성을 위한 이중 해싱

두 개의 서로 독립적인 모듈러를 사용하고 두 해시를 모두 비교하세요. 두 해시에서 동시에 충돌할 가능성은 현실적으로 거의 없습니다.

해싱이 빛을 발하는 곳

해싱은 부분 문자열 비교, 반복 구간 찾기, 패턴 검색에 활용됩니다. 매우 유연한 다용도 도구입니다.

빠른 확인

많은 부분 문자열을 안전하게 비교할 때 알맞은 도구를 선택하세요.

복습: 해싱의 장점

이제 문자열을 다항식 해시로 변환하고, 임의의 부분 문자열을 O(1)에 조회하며, 충돌을 방지할 수 있습니다. 🚀

자주 묻는 질문

“다항식 문자열 해싱” 강의는 무료인가요?

네 — “다항식 문자열 해싱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Competitive Programming Academy 강의 전체를 잠금 해제할 수 있습니다. Competitive Programming Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“다항식 문자열 해싱”에서 뭘 배우나요?

상수 시간에 부분 문자열을 비교합니다 브라우저에서 직접 실행하는 실습 코드로 Competitive Programming Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Competitive Programming Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Competitive Programming Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“다항식 문자열 해싱” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Competitive Programming Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Competitive Programming Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. KMP 접두사 함수
  2. 다항식 문자열 해싱
  3. 패턴 검색을 위한 Z 함수
  4. 접두사 조회를 위한 트라이
← Competitive Programming Academy(으)로 돌아가기