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

C# 배열에서 중복 요소를 찾는 방법 – Dictionary 활용 완벽 가이드

배열 안에 같은 값이 여러 번 나타나는지 확인하는 작업은 실무에서 자주 마주치는 문제입니다. 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을 활용하는 방법도 있으니 상황에 맞게 선택하시면 좋습니다.