도구스개발

접미사 배열·LCP 계산기

문자열의 모든 접미사를 사전순으로 늘어놓은 접미사 배열과 이웃끼리의 최장 공통 접두사(LCP)를 만들어 보여 줍니다. 서로 다른 부분문자열 개수, 가장 긴 반복 조각, 패턴 이분 탐색까지 한 화면에서 확인할 수 있습니다.

2000자까지 다룹니다. 지금 6자입니다.

서로 다른 부분문자열

15개

전체 21개에서 앞선 접미사와 겹치는 6개를 뺀 값입니다.

글자 수6자
가장 긴 반복 조각ana (3자)
LCP 합6

접미사 배열에서 이분 탐색으로 찾습니다. 겹쳐 나오는 것도 셉니다.

나온 횟수2번
나온 위치2, 4
접미사 배열 구간2 ~ 3번째
비교한 접미사5개

접미사 배열

사전순시작LCP접미사
160a
241ana
323anana
410banana
550na
632nana

시작 위치는 1부터 셉니다. LCP는 바로 윗줄 접미사와 앞에서 몇 글자를 공유하는지입니다. 찾은 패턴이 있으면 그 구간이 파랗게 칠해집니다.

사전순으로 늘어놓으면 같은 시작을 가진 접미사가 붙어 있습니다. 그래서 찾을 문자열로 시작하는 구간의 양 끝만 이분 탐색으로 찾으면 몇 번 나오는지가 구간의 길이로 바로 나옵니다. 길이 m짜리 패턴을 O(m log n)에 찾는 셈입니다. KMP나 라빈–카프가 패턴 쪽을 미리 손질하는 것과 달리 이쪽은 텍스트 쪽을 미리 손질하므로, 같은 텍스트에서 패턴을 여러 번 찾을수록 유리해집니다.
서로 다른 부분문자열 개수 = n(n+1)/2 − ΣLCP. 길이 n인 문자열의 부분문자열 자리는 모두 n(n+1)/2개인데, 사전순으로 앞선 접미사와 앞부분이 겹치는 만큼은 이미 세어진 것이라 빼 줍니다. banana라면 21 − (1+3+2) = 15개입니다.
카사이 알고리즘은 LCP를 O(n)에 구합니다. 요령은 위치 0, 1, 2… 순서로, 즉 긴 접미사부터 보는 것입니다. 위치 i의 LCP가 h라면 위치 i+1의 LCP는 최소 h−1입니다 — 앞 글자 하나만 떼어 낸 접미사라 공통 부분도 한 글자만 줄기 때문입니다. 그래서 h를 0으로 되돌리지 않고 이어서 세면 전체 비교 횟수가 2n을 넘지 않습니다.
LCP의 최댓값이 곧 가장 긴 반복 조각입니다. 두 번 이상 나오는 부분문자열은 서로 다른 두 접미사의 공통 접두사이고, 사전순으로 이웃하지 않은 두 접미사의 공통 접두사는 그 사이의 어떤 이웃 쌍보다 길 수 없기 때문입니다. mississippi에서는 issi입니다.

사용 방법

  1. 1문자열을 넣습니다. banana처럼 짧은 것부터 보면 구조가 눈에 들어옵니다.
  2. 2접미사 배열 표에서 사전순 자리와 시작 위치, LCP를 함께 봅니다.
  3. 3서로 다른 부분문자열 개수와 가장 긴 반복 조각을 확인합니다.
  4. 4찾을 문자열을 넣어 이분 탐색이 몇 번 만에 찾는지 봅니다.

자주 묻는 질문

문자열의 모든 접미사를 사전순으로 늘어놓고 그 시작 위치만 적어 둔 배열입니다. banana라면 a(5), ana(3), anana(1), banana(0), na(4), nana(2) 순이므로 접미사 배열은 [5, 3, 1, 0, 4, 2]가 됩니다. 접미사 자체를 저장하지 않고 위치만 담으므로 메모리는 문자열 길이에 비례합니다.

어떤 부분문자열이든 이분 탐색으로 O(m log n)에 찾습니다. 찾는 문자열로 시작하는 접미사들은 사전순으로 늘어놓으면 반드시 붙어 있으므로, 그 구간의 양 끝만 찾으면 몇 번 나오는지와 어디에 있는지가 한꺼번에 나옵니다. 텍스트를 한 번 만들어 두고 패턴을 여러 개 찾을 때 특히 유리합니다.

서로 다른 부분문자열의 개수를 n(n+1)/2 − ΣLCP로 즉시 세기 위해서입니다. 전체 부분문자열 n(n+1)/2개에서, 사전순으로 앞선 접미사와 앞부분이 겹쳐 이미 세어진 만큼을 빼는 셈입니다. LCP의 최댓값은 두 번 이상 나오는 가장 긴 조각의 길이이기도 합니다.

긴 접미사부터, 즉 위치 0, 1, 2… 순서로 보기 때문입니다. 위치 i의 LCP가 h라면 위치 i+1의 LCP는 최소 h−1입니다. 앞 글자 하나만 떼어 낸 접미사라 공통 부분도 한 글자만 줄어들 뿐이기 때문입니다. 그래서 h를 0으로 되돌리지 않고 이어서 세면 전체 비교 횟수가 2n을 넘지 않습니다.

패턴 쪽을 미리 손질하느냐, 텍스트 쪽을 미리 손질하느냐가 다릅니다. KMP와 라빈–카프는 패턴마다 준비를 하고 텍스트를 한 번 훑어 O(n + m)에 찾습니다. 접미사 배열은 텍스트를 한 번 준비해 두고 패턴을 O(m log n)에 찾으므로, 같은 텍스트에서 패턴을 여러 번 찾을수록 유리해집니다.

됩니다. 자바스크립트 문자열은 UTF-16이라 이모지 하나가 두 칸을 차지하는데, 그대로 자르면 접미사가 반쪽에서 시작해 사전순이 뒤틀립니다. 이 도구는 코드포인트 단위로 쪼갠 뒤 다루므로 이모지가 섞여도 접미사 경계가 깨지지 않습니다.

전송되지 않습니다. 접미사 정렬과 검색은 모두 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 접미사 배열은 배가법(prefix doubling)으로 만듭니다. 비교 정렬을 써서 O(n log²n)이며, 계수 정렬로 바꾸면 O(n log n)이 되지만 몇 천 자를 다루는 화면에서는 차이가 보이지 않아 읽기 쉬운 쪽을 골랐습니다.
  • 모든 결과를 「정의 그대로」 짠 무식한 풀이와 대조해 고정했습니다. 접미사를 통째로 만들어 정렬한 결과, 두 접미사를 한 글자씩 견줘 센 LCP, Set에 전부 넣어 센 부분문자열 개수, 훑어서 찾은 등장 위치 네 가지이며, 알파벳과 길이를 바꿔 가며 만든 무작위 문자열 250개로 검사합니다.
  • 문자는 코드포인트 단위로 다룹니다. 문자열 비교도 UTF-16 코드유닛이 아니라 코드포인트 순서로 통일했습니다 — 두 순서는 BMP 밖 글자(이모지)에서 어긋납니다.
  • 2000자까지 다룹니다. 표에는 앞 200줄만 그립니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.