C#

dictionary 설명과 dictionary을 활용한 2문제

윤태영(Coding) 2023. 6. 21. 14:10

Dictionary는 키와 값 쌍을 저장하는 컬렉션이다. 다른 언어에서는 '해시맵', '해시 테이블', '맵' 등으로 불리는 자료구조와 같다. Dictionary는 키를 사용하여 빠르게 데이터를 검색할 수 있도록 설계되어 있다.

Dictionary<TKey, TValue>는 두 개의 타입 매개변수를 사용한다

TKey: 딕셔너리의 키의 타입 지정

TValue: 딕셔너리의 값의 타입을 지정

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 정수 키와 문자열 값을 저장하는 Dictionary 생성
        Dictionary<int, string> dictionary = new Dictionary<int, string>();

        // 키-값 쌍 추가
        dictionary.Add(1, "One");
        dictionary.Add(2, "Two");
        dictionary.Add(3, "Three");

        // 키를 사용하여 값을 검색
        string value = dictionary[2];
        Console.WriteLine(value); // 출력: Two

        // 키-값 쌍 제거
        dictionary.Remove(1);

        // Dictionary의 모든 키-값 쌍을 반복 처리
        foreach (var pair in dictionary)
        {
            Console.WriteLine($"Key: {pair.Key}, Value: {pair.Value}");
        }

        // 키가 Dictionary에 존재하는지 확인
        if (dictionary.ContainsKey(3))
        {
            Console.WriteLine("Key 3 exists in the dictionary.");
        }
    }
}

 

① 하나의 배열이 주어지고, 해당 배열의 각 데이터는 숫자다.
배열 절반의 길이보다 큰 갯수만큼 특정 숫자가 들어가 있으면 해당 숫자,그렇지 않으면 -1을 리턴하는 함수를 만들어라. 

예: [2,7,7,7,1,7,2], 리턴값 : 7

using System;
using System.Collections.Generic;

class Program
{
    static int FindMajorityElement(int[] arr)
    {
        // 숫자와 빈도수를 저장하는 Dictionary 생성
        Dictionary<int, int> counts = new Dictionary<int, int>();
        
        // 각 숫자의 빈도수를 계산
        foreach (int number in arr)
        {
            if (counts.ContainsKey(number))
            {
                counts[number]++;
            }
            else
            {
                counts[number] = 1;
            }
        }
        
        // 배열의 길이의 절반을 계산
        int halfLength = arr.Length / 2;
        
        // 빈도수가 배열 길이의 절반보다 큰 숫자를 찾음
        foreach (var entry in counts)
        {
            if (entry.Value > halfLength)
            {
                return entry.Key;
            }
        }
        
        // 해당하는 숫자가 없는 경우 -1을 리턴
        return -1;
    }
    
    static void Main()
    {
        // 예제
        int[] arr = {2, 7, 7, 7, 1, 7, 2};
        int result = FindMajorityElement(arr);
        
        Console.WriteLine("리턴값: " + result); // 리턴값: 7
    }
}

 

 

② 최빈값 찾기: 주어진 배열에서 가장 많이 등장하는 숫자를 찾아서 반환하라. 만약 두 개 이상의 숫자가 같은 횟수로 등장한다면, 그 중 아무 숫자나 반환하라.

using System;
using System.Collections.Generic;

class Program
{
    static int FindMode(int[] arr)
    {
        if (arr == null || arr.Length == 0)
        {
            throw new ArgumentException("Input array should not be null or empty");
        }

        Dictionary<int, int> counts = new Dictionary<int, int>();

        // 배열의 모든 요소에 대해 반복하여 빈도수를 계산한다.
        foreach (int number in arr)
        {
            if (counts.ContainsKey(number))
            {
                counts[number]++;
            }
            else
            {
                counts[number] = 1;
            }
        }

        int maxCount = 0; // 최대 빈도수를 저장할 변수.
        int mode = 0; // 최빈값을 저장할 변수.

        // Dictionary의 모든 항목에 대해 반복한다.
        foreach (var entry in counts)
        {
            if (entry.Value > maxCount) // 현재 항목의 빈도수가 최대 빈도수보다 크면
            {
                maxCount = entry.Value; // 최대 빈도수를 현재 항목의 빈도수로 갱신한다.
                mode = entry.Key; // 최빈값을 현재 숫자로 설정한다.
            }
        }

        return mode; // 최빈값을 반환한다.
    }

    static void Main()
    {
        int[] arr = { 4, 1, 2, 2, 3, 3, 4 };

        try
        {
            int mode = FindMode(arr); // FindMode 메서드를 호출하여 최빈값을 얻는다.
            Console.WriteLine("Mode: " + mode); // 최빈값을 콘솔에 출력한다.
        }
        catch (ArgumentException e) // ArgumentException이 발생하면
        {
            Console.WriteLine(e.Message); // 예외 메시지를 콘솔에 출력한다.
        }
    }
}