알파벳의 갯수가 최대 62개라서 쉬프트 연산을 하나씩 해도 상관은 없다. 하지만 나는 비슷한 문제를 보고 온 뒤라서 문자간의 알파벳번호 차이를 이용해서 한번에 KMP 를 돌려 해결하고자 했다.
방법은 간단하다. 바로 앞 문자와의 알파벳 번호 차이를 저장해서 KMP 로 돌린다, 그러면 매칭된 패턴의 첫번째에 해당되는 문자와 W 의 첫글자 간의 차이는 몇번 쉬프트 해야 되는지를 의미하게 된다. 이때 여러번 매칭될 수 있는데, 같은 첫글자가 (곧 같은 쉬프트 횟수가) 여러개 존재하면 원문이 여러번 등장한다는 의미가 되므로 오직 한번만 해당되는 경우만 세면 된다.
구현에 주의사항이 몇가지가 있다.
문자간의 차이는 \(\vert \mathrm{A} \vert\) 로 모듈러처리를 해준다.
\(\vert \mathrm{W} \vert\) 가 1인 경우는 알파벳 번호의 차이를 구할 수 없으므로 예외처리 해준다.
댓글남기기