도구스개발

린던 분해·최소 회전 계산기

문자열을 사전순 비증가하는 린던 워드들의 곱으로 쪼개는 두발 알고리즘을 단계별로 보여 줍니다. 같은 알고리즘을 두 번 이어 붙인 문자열에 돌리면 사전순 최소 회전이 공짜로 나옵니다.

200자까지. 사전순은 문자 코드 순서로 봅니다.

린던 분해

b · an · an · a

조각 4개로 쪼개졌습니다. 사전순 비증가로 늘어서며, 이렇게 쪼개는 방법은 하나뿐입니다.

조각마다

#조각시작길이린던 워드인가
1b11
2an22
3an42
4a61

사전순 최소 회전

결과abanan
시작 위치6번째 문자
회전을 모두 만들어 고른 값abanan
두 값이 같은가같습니다

참고

길이6자
쓰인 문자 종류3가지
길이 6·문자 3가지인 린던 워드 개수116

두발 알고리즘이 움직인 과정

ijk비교한 일
010s[k] > s[j]조각 떼어냄: b
121s[k] < s[j]k를 i로 되돌리고 j++
131s[k] = s[j]k++, j++ (주기가 이어짐)
142s[k] = s[j]k++, j++ (주기가 이어짐)
153s[k] = s[j]k++, j++ (주기가 이어짐)
164s[k] > s[j]조각 떼어냄: an · an
565s[k] > s[j]조각 떼어냄: a
린던 워드는 주기를 가질 수 없습니다. 자기 자신의 모든 진회전보다 앞서야 하는데, 주기가 있으면 어떤 회전이 자기 자신과 같아져 «앞선다»가 성립하지 않기 때문입니다. 그래서 "abab"은 린던 워드가 아니고 ab · ab로 쪼개집니다.
쪼개는 방법은 하나뿐입니다. 슈발레–팽–린던 정리가 그렇게 말합니다. "banana"를 ba · na · na로 쪼개면 ba가 린던 워드가 아니고, b · a · nana로 쪼개면 nana가 린던 워드가 아니면서 비증가 조건도 깨집니다. 조건 둘을 모두 만족하는 쪼갬은 b · an · an · a 하나입니다.
최소 회전이 공짜로 따라옵니다. 문자열을 두 번 이어 붙이면 모든 회전이 그 안에 들어 있으므로, s+s에 같은 알고리즘을 돌려 길이 n을 처음 넘어서는 조각의 시작이 답이 됩니다. 부스 알고리즘과 결과가 같고 코드가 훨씬 짧습니다.
되돌아가는 것처럼 보이지만 선형입니다. k를 i로 되돌리는 줄 때문에 O(n²)로 보이기 쉬운데, j는 결코 줄지 않기 때문에 전체가 O(n)입니다. 추가 공간도 포인터 셋뿐입니다 — 이 계산기가 과정을 보여 주려고 단계를 기록하는 것은 설명을 위한 것이지 알고리즘의 일부가 아닙니다.

사용 방법

  1. 1문자열을 넣습니다. 알파벳은 무엇이든 되고 사전순은 문자 코드 순서로 봅니다.
  2. 2린던 분해 결과와 각 조각의 시작 위치가 나옵니다.
  3. 3포인터 i·j·k가 어떻게 움직였는지 단계별로 확인합니다.
  4. 4사전순 최소 회전과 그 시작 위치도 함께 나옵니다.
  5. 5회전을 모두 만들어 고른 결과와 나란히 놓아 검산합니다.

자주 묻는 질문

자기 자신의 모든 진회전보다 사전순으로 앞선 문자열입니다. "aab"은 회전 "aba"·"baa"가 모두 뒤에 오므로 린던 워드이고, "aba"는 회전 "aab"이 앞에 오므로 아닙니다. 여기서 따라 나오는 중요한 성질이 하나 있는데, 린던 워드는 주기를 가질 수 없다는 것입니다 — "abab"은 자기 회전과 같아지므로 탈락합니다.

그렇습니다. 슈발레–팽–린던 정리가 «모든 문자열은 사전순 비증가하는 린던 워드들의 곱으로 유일하게 쪼개진다»고 말합니다. "banana"를 b·an·an·a가 아닌 다른 방식으로 쪼개려 하면 어느 조각이 린던 워드가 아니거나 비증가 조건이 깨집니다. 유일성이 이 분해의 값어치입니다.

문자열을 두 번 이어 붙이면 모든 회전이 그 안에 부분문자열로 들어 있기 때문입니다. s+s에 두발 알고리즘을 돌려 길이 n을 처음 넘어서는 조각의 시작 위치가 곧 최소 회전의 시작점입니다. 부스(Booth) 알고리즘과 결과가 같고 구현이 훨씬 짧습니다.

방향이 반대입니다. 드 브루인 쪽은 린던 워드들을 «만들어 이어 붙여» 수열을 짓고, 이 계산기는 주어진 문자열을 «쪼갭니다». 같은 정리를 양쪽에서 쓰는 셈이라 함께 보시면 린던 워드가 왜 유용한지 보입니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서만 이뤄지고, 입력값은 이 기기의 저장소에만 남습니다.

알아두면 좋은 점

  • 사전순은 자바스크립트의 문자열 비교(UTF-16 코드 단위 순서)를 따릅니다. 한글·이모지처럼 코드가 큰 문자도 넣을 수 있지만 «가나다순»과는 다를 수 있습니다.
  • 두발 알고리즘 자체는 O(n) 시간·O(1) 추가 공간이지만, 이 계산기는 과정을 보여 주려고 단계를 모두 기록합니다.
  • 길이 200자까지 다룹니다.
  • 무작위 문자열 3000개에서 조각마다 정의대로 린던 워드인지, 비증가인지 확인했고 최소 회전은 회전 전체를 만들어 대조했습니다.

함께 보면 좋은 도구

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