더북(TheBook)

018 두 문자열이 애너그램인지 검사

 

같은 문자들을 서로 다른 순서로 포함하는 두 문자열을 애너그램(anagram)이라 부른다. 어떤 정의에서는 대소문자를 구분하지 않고(않거나) 여백(공백)을 무시한다.

따라서 어떤 알고리즘을 적용하든 해법은 주어진 문자열을 소문자로 바꾸고 여백(공백)을 제거해야 한다. 첫 번째로 살펴볼 해법에서는 배열을 Arrays.sort()로 정렬한 후 Arrays.equals()로 동등하지 검사한다.

애너그램이면 정렬 후에 서로 동등하다(다음 그림은 두 단어가 애너그램임을 보여준다).

▲ 그림 1-2

위 해법(과 자바 8 함수형 스타일 버전)은 이 책의 예제 코드에 들어 있다. 두 해법의 가장 큰 문제는 정렬 부분이다. 이어지는 해법에서는 정렬 단계를 없애고 (0으로 초기화한) 인덱스 256개의 빈 배열을 사용한다(256개 인덱스는 확장 아스키표의 문자 코드로서 자세한 내용은 002. 반복되지 않는 첫 번째 문자 찾기 절을 참고한다).

알고리즘은 아주 간단하다.

첫 번째 문자열의 각 문자마다 해당하는 아스키 코드의 배열 값을 1씩 증가시킨다.

두 번째 문자열의 각 문자마다 해당하는 아스키 코드의 배열 값을 1씩 감소시킨다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.