안녕하세요.
백준 10815번 '숫자카드' 문제 풀이를 진행해보도록 하겠습니다.
해당 문제는 상근이가 숫자카드 N개를 가지고있고, 정수 M개가 주어질때, 이 숫자를 상근의 숫자카드가 가지고 있는지 아닌지를 구하는 문제입니다.
입력으로 숫자카드의 개수 N과 숫자카드에 적힌 숫자, 찾아야할 숫자의 개수와 숫자들이 주어집니다.
예제출력:
5
6 3 2 10 -10
8
10 9 -5 2 3 4 5 -10
예제출력:
1 0 0 1 1 0 0 1
문제를 해결하기 위해서 우선 입력을 받아오는 코드를 작성하였습니다.
int N = int.Parse(Console.ReadLine());
int[] cardNums = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int M = int.Parse(Console.ReadLine());
int[] findNums = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
다음으로 숫자를 저장할 HashSet 배열을 선언해줍니다.
또한 출력속도를 향상시키기 위한 StringBuilder 도 같이 선언해주었습니다.
HashSet<int> cardSet = new HashSet<int>(cardNums);
StringBuilder sb = new StringBuilder();
이제 반복문을 통해서 HashSet의 Contains함수를 사용해 숫자를 찾아줍니다.
Contains함수는 해시로 숫자의 존재여부를 즉시 반환하기 때문에 시간단축에 매우 효율적입니다.
만약 찾으려고 하는 숫자가 cardset(해시배열)에 존재한다면, sb(StringBuilder)에 1을 추가하고, 아니라면 0을 추가합니다.
for (int i = 0; i < M; i++)
{
if (cardSet.Contains(findNums[i]))
sb.Append("1 ");
else
sb.Append("0 ");
}
마지막으로 StringBuilder를 출력해줍니다.
StringBuilder를 사용하게 되면 문자열을 누적한 후 한번에 출력할 수 있기 때문에 이 또한 시간단축에 있어 효율적입니다.
Console.WriteLine(sb.ToString());
다음은 전체코드입니다.
전체코드
using System;
using System.Collections.Generic;
using System.Text;
class Program
{
static void Main()
{
int N = int.Parse(Console.ReadLine());
int[] cardNums = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int M = int.Parse(Console.ReadLine());
int[] findNums = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
HashSet<int> cardSet = new HashSet<int>(cardNums);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M; i++)
{
if (cardSet.Contains(findNums[i]))
sb.Append("1 ");
else
sb.Append("0 ");
}
Console.WriteLine(sb.ToString());
}
}
'알고리즘 풀이' 카테고리의 다른 글
| [C#] 백준 10773번 문제풀이 (2) | 2025.07.27 |
|---|---|
| [C#] 백준 1260번 문제풀이 (4) | 2025.07.26 |
| [C#] 백준 2745번 문제풀이 (0) | 2025.07.24 |
| [C#] 백준 20920번 문제풀이 (3) | 2025.07.22 |
| [C#] 백준 2805번 문제풀이 (1) | 2025.07.21 |