개요
프로그래밍에서 자주 접하는 문제 중 하나는 주어진 문자열에 중복 없는 고유한(unique) 문자만 포함되어 있는지 확인하는 것입니다. 예를 들어 "abcde"는 모든 문자가 고유하지만, "hello"에는 'l'이 두 번 등장하므로 고유하지 않습니다.
확인 원리
가장 기본적인 방법은 이중 반복문을 사용하는 것입니다. 각 문자를 그 뒤에 오는 모든 문자와 하나씩 비교하여 동일한 문자가 존재하는지 검사합니다.
먼저, 문자열의 현재 위치 i의 문자를 다음 위치의 문자들과 비교합니다:
for (int j = i + 1; j < val.Length; j++) {
if (val[i] == val[j])
}판정 조건
1. 일치하는 문자를 찾은 경우
비교 과정에서 같은 문자가 발견되면, 해당 문자열에는 고유하지 않은(중복된) 문자가 있다는 의미입니다. 이 경우 즉시 false를 반환하여 더 이상 검사를 진행할 필요가 없도록 합니다:
for (int j = i + 1; j < val.Length; j++) {
if (val[i] == val[j])
return false;
}2. 일치하는 문자를 찾지 못한 경우
모든 문자 쌍을 비교했음에도 일치하는 문자가 하나도 없다면, 해당 문자열은 모두 고유한 문자로 구성되어 있는 것이므로 최종적으로 true를 반환합니다.
완전한 예제 코드
위 로직을 실제로 활용할 수 있는 전체 메서드 예제는 다음과 같습니다:
using System;
class Program {
static bool HasUniqueCharacters(string val) {
// 빈 문자열이나 한 글자는 모두 고유한 문자로 처리
if (val.Length <= 1)
return true;
for (int i = 0; i < val.Length - 1; i++) {
for (int j = i + 1; j < val.Length; j++) {
if (val[i] == val[j])
return false;
}
}
return true;
}
static void Main() {
Console.WriteLine(HasUniqueCharacters("abcdef")); // True
Console.WriteLine(HasUniqueCharacters("hello")); // False
}
}참고: 성능 개선 팁
위 방법의 시간 복잡도는 O(n²)입니다. 문자열이 매우 길다면 HashSet<char>을 활용하면 시간 복잡도를 O(n)까지 줄일 수 있습니다:
static bool HasUniqueCharacters(string val) {
var seen = new HashSet<char>();
foreach (char c in val) {
if (!seen.Add(c))
return false;
}
return true;
}HashSet.Add()는 이미 존재하는 요소를 추가하려 하면 false를 반환하기 때문에, 이를 이용하면 한 번의 순회만으로 중복 여부를 판별할 수 있습니다.