본문 바로가기
백준

[10815] 숫자 카드 (JAVA)

by 댈팽이 2024. 3. 29.
728x90

# 문제 설명

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.


출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.

 

# 정답 코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(st.nextToken()); //숫자 카드의 개수

        int[] arr = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int n = 0; n < N; n++) {
            arr[n] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr); //오름차순 정렬

        st = new StringTokenizer(br.readLine());
        int M = Integer.parseInt(st.nextToken()); //같은지 구해야할 숫자의 개수

        st = new StringTokenizer(br.readLine());
        for (int m = 0; m < M; m++) {
            int target = Integer.parseInt(st.nextToken());
            boolean find = false;
            int start = 0;
            int end = N-1;

            while (start <= end) {
                int midIdx = (start + end) / 2;
                int midVal = arr[midIdx];

                if (target < midVal) {
                    end = midIdx-1;
                }
                else if (midVal < target) {
                    start = midIdx+1;
                }
                else {
                    find = true;
                    break;
                }
            }

            if (find) {
                sb.append("1 ");
            }
            else {
                sb.append("0 ");
            }
        }

        System.out.print(sb);
    }
}

 

M개의 수가 배열에 있는 데이터이면 1을, 없는 데이터이면 0을 출력하는 문제이다.

이진 탐색을 이용하여 타깃 데이터를 찾았다.

 

크기가 N인 배열을 만들어 데이터를 입력받는다.

이진 탐색을 사용하기 위해 오름차순 정렬한다.

 

그 다음 M번만큼 반복하며 답을 구한다.

target에 타깃 데이터의 값을 입력받는다.

타깃 데이터를 찾았는지 체크할 find를 만든다.

이진 탐색 데이터셋을 설정할 start와 end를 각각 0, N-1로 설정한다.

 

start가 end보다 작거나 같을 때까지 반복하며 이진 탐색을 실행한다.

  • 타깃 데이터 < 중앙값이면 end를 midIdx-1로 설정한다.
  • 중앙값 < 타깃 데이터이면 start를 midIdx+1로 설정한다.
  • 중앙값 == 타깃 데이터이면 find를 true로 설정하고 while문을 종료한다.

find가 true이면 1을 출력하고 false이면 0을 출력한다.

728x90

'백준' 카테고리의 다른 글

[2343] 기타 레슨 (JAVA)  (0) 2024.03.30
[1920] 수 찾기 (JAVA)  (0) 2024.03.30
[11724] 연결 요소의 개수 (JAVA)  (0) 2024.03.29
[2606] 바이러스 (JAVA)  (0) 2024.03.29
[10989] 수 정렬하기 3 (JAVA)  (0) 2024.03.28