배열 안에 같은 값이 여러 번 나타나는지 확인하는 작업은 실무에서 자주 마주치는 문제입니다. C#에서는 Dictionary를 활용하면 간단하고 효율적으로 중복 요소를 찾을 수 있습니다. 이 글에서는 Dictionary의 ContainsKey() 메서드를 사용해 배열의 중복 여부를 판별하고, 각 요소가 몇 번 등장했는지까지 확인하는 방법을 단계별로 살펴보겠습니다.
1단계: 배열 선언하기
먼저 중복 여부를 검사할 정수형 배열을 준비합니다.
int[] arr = {
89,
12,
56,
89,
};위 배열에는 값 89가 두 번 포함되어 있어 중복이 존재합니다.
2단계: Dictionary 생성하기
다음으로, 각 요소의 등장 횟수를 저장할 새로운 Dictionary를 생성합니다. 키(key)에는 배열의 값, 값(value)에는 해당 요소가 등장한 횟수를 저장하게 됩니다.
var d = new Dictionary<int, int>();
3단계: ContainsKey()로 중복 요소 찾기
배열을 순회하면서 ContainsKey() 메서드로 현재 요소가 Dictionary에 이미 존재하는지 확인합니다. 이미 존재하면 카운트를 1 증가시키고, 존재하지 않으면 새로 추가하며 값을 1로 설정합니다.
foreach(var res in arr) {
if (d.ContainsKey(res))
d[res]++;
else
d[res] = 1;
}전체 예제 코드
지금까지의 과정을 모두 합친 전체 코드는 다음과 같습니다.
using System;
using System.Collections.Generic;
namespace Demo {
public class Program {
public static void Main(string[] args) {
int[] arr = {
89,
12,
56,
89,
};
var d = new Dictionary<int, int>();
foreach(var res in arr) {
if (d.ContainsKey(res))
d[res]++;
else
d[res] = 1;
}
foreach(var val in d)
Console.WriteLine("{0} occurred {1} times", val.Key, val.Value);
}
}
}실행 결과
89 occurred 2 times 12 occurred 1 times 56 occurred 1 times
코드 동작 원리 및 성능
이 방식은 배열을 한 번만 순회하므로 시간 복잡도가 O(n)입니다. Dictionary는 해시(Hash) 기반으로 구현되어 있어 ContainsKey() 호출이 거의 상수 시간에 처리되며, 따라서 크기가 큰 배열에서도 빠르게 중복을 탐색할 수 있습니다.
실행 결과에서 알 수 있듯이 89는 2번, 12와 56은 각각 1번 등장했습니다. 만약 중복 존재 여부만 확인하고 싶다면, Value가 1보다 큰 항목이 하나라도 있는지만 검사하면 됩니다. 또한 LINQ의 GroupBy()나 HashSet을 활용하는 방법도 있으니 상황에 맞게 선택하시면 좋습니다.