Arian Soleimanzadeh
  • 홈
  • 블로그
  • 팟캐스트
  • 비디오
  • 문의
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
패널•빠른 문의

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

상담 예약

짧은 메시지를 남겨주세요 — 가능한 한 빠르게 답변드리겠습니다.

LinkedIn빠른 응답
홈/아티클/Rabin–Karp 알고리즘이란? Rolling Hash로 문자열 검색하기
Algorithms아티클

Rabin–Karp 알고리즘이란? Rolling Hash로 문자열 검색하기

Rabin–Karp는 Rolling Hash를 사용해 문자열의 각 구간을 빠르게 비교하고 Hash가 일치할 때만 실제 문자열을 확인하는 대표적인 Pattern Matching 알고리즘입니다.

2026년 8월 19일7 분 읽기0 조회수
#Algorithms#Rabin-Karp#Rolling Hash#Hashing#String Algorithms#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

Sliding Window와 Rolling Hash를 이용해 Pattern을 검색하는 Rabin–Karp 알고리즘 시각화

Arian Soleimanzadeh

AI · 코드 · 제품

연구 + 엔지니어링
이 페이지에서
Rolling HashHash CollisionPolynomial HashTypeScript 구현복잡도KMP와 비교여러 Pattern 검색실제 활용Double Hashing흔한 실수기술 면접정리

Rabin–Karp는 Text 안에서 Pattern을 검색하는 대표적인 문자열 알고리즘입니다.

모든 위치에서 Pattern의 모든 문자를 직접 비교하는 대신 Pattern과 Text Window의 Hash를 비교합니다.

핵심은 다음과 같습니다.

Hash가 다르면 바로 Skip하고, Hash가 같을 때만 실제 문자를 확인한다.

Rolling Hash

현재 Window가:

ABC

이고 다음이:

BCD

라면 BCD 전체 Hash를 다시 계산할 필요가 없습니다.

A의 영향을 제거하고 D를 추가해 다음 Hash를 만들 수 있습니다.

이를 Rolling Hash라고 합니다.

Hash Collision

서로 다른 문자열이 같은 Hash를 가질 수 있습니다.

따라서:

Hash Match
↓
Exact Comparison
↓
Real Match / Collision

과정이 필요합니다.

Polynomial Hash

문자열을 다음과 같은 다항식 형태로 생각할 수 있습니다.

A × base² + B × base + C

그리고 Prime Modulo를 사용해 숫자의 크기를 제한합니다.

TypeScript 구현

function rabinKarp(
  text: string,
  pattern: string
): number {
  const n = text.length;
  const m = pattern.length;

  if (m === 0) return 0;
  if (m > n) return -1;

  const base = 256;
  const prime = 101;

  let patternHash = 0;
  let windowHash = 0;
  let highOrder = 1;

  for (let i = 0; i < m - 1; i++) {
    highOrder = (highOrder * base) % prime;
  }

  for (let i = 0; i < m; i++) {
    patternHash = (
      base * patternHash + pattern.charCodeAt(i)
    ) % prime;

    windowHash = (
      base * windowHash + text.charCodeAt(i)
    ) % prime;
  }

  for (let i = 0; i <= n - m; i++) {
    if (
      patternHash === windowHash &&
      text.slice(i, i + m) === pattern
    ) {
      return i;
    }

    if (i < n - m) {
      windowHash = (
        base * (
          windowHash -
          text.charCodeAt(i) * highOrder
        ) +
        text.charCodeAt(i + m)
      ) % prime;

      if (windowHash < 0) {
        windowHash += prime;
      }
    }
  }

  return -1;
}

복잡도

평균적인 경우:

O(n + m)

많은 Collision이 발생하는 최악의 경우:

O(n × m)

추가 공간은 기본 구현에서:

O(1)

입니다.

KMP와 비교

KMP는 Pattern의 Prefix/Suffix 구조와 LPS 배열을 사용합니다.

Rabin–Karp는 Hash와 Rolling Hash를 사용합니다.

KMP는 O(n + m)을 보장하지만 Rabin–Karp는 Collision이 많으면 Worst Case가 더 나빠질 수 있습니다.

여러 Pattern 검색

같은 길이의 Pattern이 여러 개 있다면 각 Pattern의 Hash를 Set에 저장할 수 있습니다.

각 Text Window의 Hash를 Set에서 검색하고 Candidate만 실제 비교하면 됩니다.

실제 활용

Rolling Hash 개념은 다음에 활용할 수 있습니다.

  • 문자열 검색
  • Duplicate Detection
  • Plagiarism Detection
  • Document Fingerprinting
  • DNA Sequence Search
  • Repeated Substring
  • Substring Equality Queries

Double Hashing

서로 다른 두 Prime과 Hash를 함께 사용하면 Collision 가능성을 크게 줄일 수 있습니다.

흔한 실수

  • Hash 값만으로 문자열이 같다고 판단하기.
  • Window마다 Hash를 처음부터 계산하기.
  • Modulo를 빼먹기.
  • 적절하지 않은 Hash 파라미터 사용하기.
  • Window에서 빠지는 문자의 Weight를 잘못 제거하기.

기술 면접

Rabin–Karp는 다음 개념을 동시에 확인할 수 있는 문제입니다.

  • Hashing
  • Sliding Window
  • Modular Arithmetic
  • String Matching
  • Collision Handling

가장 중요한 부분은 Rolling Hash가 어떻게 업데이트되는지 이해하는 것입니다.

정리

Rabin–Karp의 구조는 다음과 같습니다.

Pattern Hash

Text Window
↓
Rolling Hash
↓
Compare
↓
Verify

가장 중요한 아이디어는 새 Window의 Hash를 처음부터 만들지 않고 이전 Window의 Hash에서 빠르게 계산하는 Rolling Hash입니다.

이 페이지에서
Rolling HashHash CollisionPolynomial HashTypeScript 구현복잡도KMP와 비교여러 Pattern 검색실제 활용Double Hashing흔한 실수기술 면접정리

아티클 정보

게시 정보, 읽기 시간 및 조회 데이터입니다.

게시일

2026년 8월 19일

업데이트

2026년 8월 19일

읽기 시간

7 분 읽기

조회수

0

작성자

Arian Soleimanzadeh

이전 아티클

KMP 알고리즘이란? Knuth–Morris–Pratt 문자열 검색 이해하기

다음 아티클

Levenshtein Distance란? Dynamic Programming으로 Edit Distance 이해하기

깔끔하고 빠르며 아름다운 것을 함께 만들어 봅시다.

협업, 컨설팅, 제품 작업을 위한 빠른 문의입니다.

빠른 문의이메일 보내기
Arian Soleimanzadeh

현대적인 웹 엔지니어링, UI 시스템, 실용적인 AI 제품에 집중한 개인 포트폴리오 — 깨끗한 코드, 명확한 디자인.

빠른 링크

  • 소개
  • 블로그
  • 프로젝트
  • 문의

문의

  • info@ariansoleimanzadeh.site
  • soleimanzadeh.a.work@gmail.com

가능 시간: 평일

보통 다음 시간 내에 답변합니다 24시간.

뉴스레터

글, 프로젝트, 새 릴리스에 대한 업데이트를 받아보세요.

© 2026 ariansoleimanzadeh.site — 모든 권리 보유.

LinkedIn