회문(Palindrome)은 앞에서부터 읽어도 뒤에서부터 읽어도 동일한 문자열을 의미합니다. 예를 들어 "Madam", "Noon", "Level"처럼 글자 순서를 거꾸로 해도 같게 읽히는 문자열이 여기에 해당합니다.
C#에서 문자열이 회문인지 확인하는 가장 기본적인 방법은 문자열을 뒤집은 뒤 원본과 비교하는 것입니다. 두 값이 일치하면 그 문자열은 회문입니다.
회문 확인 절차
먼저 Array.Reverse() 메서드로 문자열의 역순을 구하고, Equals() 메서드를 사용해 원본 문자열과 뒤집힌 문자열을 비교합니다. 비교 결과가 true라면 해당 문자열은 회문입니다.
단계별 처리 과정
1. ToCharArray()로 문자열을 문자 배열(char[])로 변환합니다.
2. Array.Reverse()로 배열의 순서를 뒤집습니다.
3. new string()으로 뒤집힌 배열을 다시 문자열로 만듭니다.
4. Equals() 메서드로 원본과 뒤집힌 문자열을 비교합니다.
예제 코드
다음 예제에서는 문자열 "Madam"이 회문인지 확인합니다. "Madam"은 뒤집으면 "madam"이 되며, 대소문자를 무시하면 원본과 동일하므로 회문으로 판별됩니다.
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
string string1, rev;
string1 = "Madam";
char[] ch = string1.ToCharArray();
Array.Reverse(ch);
rev = new string(ch);
bool b = string1.Equals(rev, StringComparison.OrdinalIgnoreCase);
if (b == true) {
Console.WriteLine("String " + string1 + " is a Palindrome!");
} else {
Console.WriteLine("String " + string1 + " is not a Palindrome!");
}
Console.Read();
}
}
}실행 결과
String Madam is a Palindrome!
코드 설명
StringComparison.OrdinalIgnoreCase 옵션을 사용하면 대소문자 차이를 무시하고 비교할 수 있습니다. 덕분에 "Madam"과 "madam"처럼 대소문자만 다른 경우에도 같은 회문으로 인식됩니다. 반대로 대소문자까지 엄격하게 구분해야 한다면 이 옵션을 제거하고 기본 Equals() 비교를 사용하면 됩니다.
참고: 두 포인터 방식의 대안
배열을 뒤집지 않고 문자열의 양 끝에서부터 안쪽으로 이동하며 문자를 하나씩 비교하는 방법도 있습니다. 이 방식은 별도의 복사본을 만들지 않아 메모리를 절약할 수 있고, 최대 문자열 길이의 절반만 비교하면 되므로 더 효율적인 판별이 가능합니다.