목차
백준 단계별로 풀어보기
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을 쓰는 것이 적합하다.
- StreamReader로 입력값을 받아 int값으로 변환하여 상근이가 가지고 있는 숫자 카드의 개수를 담을 변수 n 에 담는다.
 - Array.ConvertAll() 을 활용하여 숫자 카드에 적혀있는 정수를 입력받아 곧바로 int값으로 변환하여 HashSet 자료구조인 cards 에 담는다.
 - StreamReader로 입력값을 받아 int값으로 변환하여 주어질 수의 개수를 담을 변수 m 에 담는다.
 - Array.ConverAll() 을 활용하여 상근이의 숫자 카드와 비교할 숫자를 입력받아 곧바로 int값으로 변환하여 int형 배열 numM 에 담는다.
 - 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 |