WalkerJei's Lifelog

백준알고리즘 1920번 수 찾기 C# 본문

소프트웨어 개발/코딩테스트(기성 문제)

백준알고리즘 1920번 수 찾기 C#

WalkerJei 2025. 4. 25. 22:41

세부 정보

  • 사이트: 백준알고리즘
  • 번호: 1920
  • 문제명: 수 찾기
  • 언어: C#
  • 분류: 자료 구조, 정렬, 이분 탐색, 해시를 사용한 집합과 맵
  • 비고: 

 

문제

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

 

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -2^31 보다 크거나 같고 2^31보다 작다.

 

출력

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

 

풀이

BinarySearch()를 사용하면 이진 탐색을 통한 분석을 하고 인덱스 번호를 할당한다.

using System.Text;

StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

StringBuilder sb = new StringBuilder();

// 1차적으로 입력할 자연수의 개수
int n = int.Parse(sr.ReadLine());
// 1차적으로 입력할 자연수들
string[] input = sr.ReadLine().Trim().Split();
// 1차 자연수와 2차 자연수를 비교하고 
List<int> list = new List<int>();
// 2차적으로 입력할 자연수의 개수
int m = int.Parse(sr.ReadLine());
// 2차적으로 입력할 자연수들
string[] search = sr.ReadLine().Trim().Split();
// 리스트에 1차적으로 입력한 자연수들을 대입
for (int i = 0; i < input.Length; i++)
    list.Add(int.Parse(input[i]));
// 리스트를 오름차순으로 정렬
list.Sort();

for (int i = 0; i < m; i++)
{
    // 리스트를 이진 탐색으로 분석해서 인덱스 번호 할당
    int index = list.BinarySearch(int.Parse(search[i]));
    // 인덱스 번호가 0 미만이면 답이 존재하지 않기에 0이다.
    // 인덱스 번호가 1 이상이면 답이 존재하기에 1이다.
    sb.Append(index < 0 ? "0\n" : "1\n");
}

sw.WriteLine(sb.ToString());

sr.Close();
sw.Close();

 

후기

이 문제는 주로 사용하던 Convert.ToInt32()로 해결하려고 하면 "런타임 에러 (IndexOutOfRange)"를 출력하지만 int.Parse()를 사용하면 런타임 에러 없이 정상적으로 작동한다. 언급했던 두 함수들의 차이를 알아보아야겠다.