Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#으로 문자열이 모두 고유한 문자로 이루어져 있는지 확인하는 방법

개요

프로그래밍에서 자주 접하는 문제 중 하나는 주어진 문자열에 중복 없는 고유한(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를 반환하기 때문에, 이를 이용하면 한 번의 순회만으로 중복 여부를 판별할 수 있습니다.