아나그램(Anagram)이란 한 문자열의 문자들을 재배열하여 다른 문자열을 만들 수 있는 경우를 말합니다. 즉, 두 문자열에 포함된 문자의 종류와 개수는 같지만 문자의 순서는 달라도 되는 관계입니다.
아나그램 판별 원리
예를 들어 다음 두 문자열을 살펴보겠습니다.
string str1 = "silent"; string str2 = "listen";
두 문자열은 모두 s, i, l, e, n, t로 구성되어 있으므로 서로 아나그램입니다. C#에서 이를 확인하려면 다음 단계를 따릅니다.
1단계: 문자열을 문자 배열로 변환
대소문자 차이로 인한 오류를 방지하기 위해 ToLower()로 모두 소문자로 만든 뒤, ToCharArray()로 문자 배열로 변환합니다.
char[] ch1 = str1.ToLower().ToCharArray(); char[] ch2 = str2.ToLower().ToCharArray();
2단계: 문자 배열 정렬
Array.Sort() 메서드를 사용해 두 배열을 오름차순으로 정렬합니다. 정렬 후에는 두 문자열이 아나그램이라면 완전히 동일한 배열이 됩니다.
Array.Sort(ch1); Array.Sort(ch2);
3단계: 정렬된 배열을 다시 문자열로 변환
string val1 = new string(ch1); string val2 = new string(ch2);
4단계: 두 문자열 비교
정렬된 두 문자열이 동일하다면 원래 문자열들은 서로 아나그램입니다.
전체 예제 코드
using System;
public class Demo {
public static void Main () {
string str1 = "silent";
string str2 = "listen";
char[] ch1 = str1.ToLower().ToCharArray();
char[] ch2 = str2.ToLower().ToCharArray();
Array.Sort(ch1);
Array.Sort(ch2);
string val1 = new string(ch1);
string val2 = new string(ch2);
if (val1 == val2) {
Console.WriteLine("두 문자열은 아나그램입니다.");
} else {
Console.WriteLine("두 문자열은 아나그램이 아닙니다.");
}
}
}실행 결과
두 문자열은 아나그램입니다.
참고 사항
이 방식의 시간 복잡도는 정렬에 의해 O(n log n)입니다. 더 빠른 성능이 필요하다면 각 문자의 등장 횟수를 세는 해시맵(Dictionary) 기반 접근(O(n))도 고려할 수 있습니다. 또한 공백과 문장부호를 무시해야 하는 경우라면 비교 전에 해당 문자들을 제거하는 전처리 과정을 추가하면 됩니다.