[오늘의 문제] 수 찾기

shlim55·2025년 3월 17일

코딩테스트

목록 보기
3/223

출처: https://www.acmicpc.net/problem/1920

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안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.
출력 형식
M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.
예제 입력 1
5 4 1 5 2 3 5 1 3 7 9 5
예제 출력 1
1 1 0 0 1

import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

// 입력 처리
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}

int m = sc.nextInt();
int[] queries = new int[m];
for (int i = 0; i < m; i++) {
queries[i] = sc.nextInt();
}

// 정렬
Arrays.sort(arr);

// 이진 탐색 결과 계산
for (int query : queries) {
if (binarySearch(arr, query)) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}

public static boolean binarySearch(int[] arr, int target) {
int left = 0, right = arr.length - 1;

// 이진 탐색이 계속 실행될 조건
while (____) {
int mid = (left + right) / 2;

if (__) {
// 이진 탐색에서 타겟을 찾았는지 확인하는 조건
return true;
} else if (__
) {
// 타겟 값이 중간 값보다 큰 경우의 조건
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
}

빈칸 1: X
정답: left <= right
해설: 이진 탐색은 배열의 왼쪽 인덱스와 오른쪽 인덱스 사이를 반복적으로 좁히며 진행합니다. 탐색이 종료되려면 left가 right보다 커야 하므로, 반복 조건은 left <= right입니다.
->나는 left > right를 선택했다. 이진 탐색 이란 개념 자체를 잘 몰랐다.

빈칸 2: O
정답: arr[mid] == target
해설: 이진 탐색은 배열의 중간 값 arr[mid]와 타겟 값을 비교하여 탐색 방향을 결정합니다. arr[mid] == target일 경우, 타겟 값을 찾았으므로 true를 반환합니다.

빈칸 3: O
정답: arr[mid] < target
해설: arr[mid] < target일 경우, 타겟 값이 배열의 오른쪽에 있다는 의미입니다. 따라서, 탐색 범위를 오른쪽으로 좁히기 위해 left = mid + 1로 설정합니다.

profile
A Normal Programmer

0개의 댓글