본문 바로가기
Development/Baekjoon

[C#] 10815번: 숫자 카드

by Mobics 2025. 10. 28.

목차


    백준 단계별로 풀어보기

    25.10.28

    14단계: 집합과 맵


    10815번: 숫자 카드

    문제 링크 : https://www.acmicpc.net/problem/10815

     

    문제를 풀기 위해 알아야 할 개념

    >> HashSet<T>

    : 해시 테이블을 기반으로 구현된 집합 데이터 구조로, 데이터의 순서를 보장하지 않으며 데이터의 중복을 허용하지 않는다.

     

    - 특징

    • 탐색에 특화된 자료구조로, 평균 O(1)의 시간복잡도로 데이터를 탐색, 삽입, 삭제가 가능하다. --> 해시 충돌이 많이 일어나면 최악의 경우 O(n)의 시간복잡도를 가진다.
    • 대량의 데이터를 효율적으로 관리할 수 있으며, 특히 고유한 값들을 유지해야 하는 경우에 유용하다.
    • 해시값을 저장해야 하기 때문에 메모리를 많이 차지한다.

     

    - 언제 사용하기 좋은가?

    • 중복된 데이터를 제거해야 할 때
    • 데이터의 존재 여부를 확인해야 할 때

     

    - 주요 메서드

    • Add(T item) : 해시셋에 요소를 추가한다. 만약 이미 요소가 존재한다면 추가하지 않으며, false를 반환한다.
    • Remove(T item) : 해시셋에서 특정 요소를 제거한다. 제거에 성공하면 true를 반환하고 실패하면 false를 반환한다.
    • Contains(T item) : 해시셋에 특정 요소가 포함되어 있는지 확인한다. 해당 요소가 존재하면 true를 반환하고 없으면 false를 반환한다.
    • Clear() : 해시셋의 모든 요소를 제거한다.
    • Count : 해시셋에 포함된 요소의 수를 반환한다.

     

    ※ 공식 문서 - HashSet<T>

     

    HashSet<T> 클래스 (System.Collections.Generic)

    값 집합을 나타냅니다.

    learn.microsoft.com

     

    ※ 참고 블로그

     

    [C#] 해시셋 (HashSet)

    1. 해시셋(HashSet)이란? 해시셋(HashSet)은 C#의 'System.Collections.Generic' 네임스페이스에 포함된 컬렉션 클래스 중 하나로, 해시 테이블을 기반으로 구현된 집합 데이터 구조입니다. 해시셋은 중복되지

    unity-programming-study.tistory.com

     

    >> Array.ConvertAll(변환할 배열, 변환할 형식)

    : 매개변수로 받은 배열을, 매개변수로 받은 형식으로 변환하여 새로운 배열로 반환한다.

     

    - 예시 코드

    : 첫째 줄에 수의 개수가 주어지고 둘째 줄에 주어진 개수만큼 수가 주어질 때

    // 입력값
    // 5
    // 6 3 2 10 -10
    
    // 기존 방식
    int count = int.Parse(Console.ReadLine());
    string[] s = Console.ReadLine().Split();
    int[] arr = new int[count];
    
    for (int i = 0; i < count; i++)
    {
        arr[i] = int.Parse(s[i]);
    }
    
    // Array.ConvertAll() 방식
    int count = int.Parse(Console.ReadLine()); // 사실상 count를 사용하진 않지만, 입력값이 있기 때문에 작성
    int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

     

    ※ 공식 문서 - Array.ConvertAll()

     

    Array.ConvertAll<TInput,TOutput>(TInput[], Converter<TInput,TOutput>) Method (System)

    Converts an array of one type to an array of another type.

    learn.microsoft.com

     

    문제 풀이

    : 상근이가 가진 카드에 중복된 수가 적혀있는 경우는 없고, 주어진 수를 상근이가 가지고 있는지 아닌지만 찾으면 되기 때문에 HashSet을 쓰는 것이 적합하다.

    1. StreamReader로 입력값을 받아 int값으로 변환하여 상근이가 가지고 있는 숫자 카드의 개수를 담을 변수 n 에 담는다.
    2. Array.ConvertAll() 을 활용하여 숫자 카드에 적혀있는 정수를 입력받아 곧바로 int값으로 변환하여 HashSet 자료구조인 cards 에 담는다.
    3. StreamReader로 입력값을 받아 int값으로 변환하여 주어질 수의 개수를 담을 변수 m 에 담는다.
    4. Array.ConverAll() 을 활용하여 상근이의 숫자 카드와 비교할 숫자를 입력받아 곧바로 int값으로 변환하여 int형 배열 numM 에 담는다.
    5. foreach 반복문을 통해 numM 에 있는 수가 cards 에 있는지 Contains 함수로 확인하고, 삼항연산자를 통해 포함되어 있다면 '1 ', 아니라면 '0 '을 StringBuilder에 담은 다음 출력한다. --> 삼항연산자를 통해 StringBuilder에 담을 때, 띄어쓰기도 포함하여 담는다.

     

    정답 코드

    using System.IO;
    using System.Text;
    
    class Backjoon
    {
        static void Main(string[] args)
        {
            using var sr = new StreamReader(Console.OpenStandardInput());
            using var sw = new StreamWriter(Console.OpenStandardOutput());
            StringBuilder sb = new StringBuilder();
    
            int n = int.Parse(sr.ReadLine());
            HashSet<int> cards = new HashSet<int>(Array.ConvertAll(sr.ReadLine().Split(), int.Parse));
            
            int m = int.Parse(sr.ReadLine());
            int[] numM = Array.ConvertAll(sr.ReadLine().Split(), int.Parse);
    
            foreach (var num in numM)
                sb.Append(cards.Contains(num) ? "1 " : "0 ");
            
            sw.Write(sb.ToString().TrimEnd());
        }
    }

    'Development > Baekjoon' 카테고리의 다른 글

    [C#] 7785번: 회사에 있는 사람  (0) 2025.10.30
    [C#] 14425번: 문자열 집합  (0) 2025.10.29
    [C#] 18870번: 좌표 압축  (0) 2025.10.27
    [C#] 10814번: 나이순 정렬  (0) 2025.10.26
    [C#] 1181번: 단어 정렬  (0) 2025.10.25