It's easy, if you try

[백준/boj] 1920: 수 찾기 (Java) / 이분 탐색 / 분할 정복 본문

알고리즘/자바(Java)

[백준/boj] 1920: 수 찾기 (Java) / 이분 탐색 / 분할 정복

s5he2 2021. 7. 8. 14:10
반응형

문제

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

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

풀이

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

public class Main {
	static int[] list, nums;
	static StringBuilder sb;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		sb = new StringBuilder();
		StringTokenizer st;
		
		int N = Integer.parseInt(br.readLine());
		list = new int[N];
		st = new StringTokenizer(br.readLine());
		for(int i=0; i< N; i++) {
			list[i] = Integer.parseInt(st.nextToken());
		}
		Arrays.sort(list);

		int M = Integer.parseInt(br.readLine());
		nums = new int[M];
		st = new StringTokenizer(br.readLine());
		for(int i=0; i< M; i++) {
			nums[i] = Integer.parseInt(st.nextToken());
		}
		
		for(int i=0; i<M; i++) {
			System.out.println(findNum(nums[i], 0, N-1));
		}
	}
	
	private static int findNum(int num, int start, int end) {
		int answer = 0;
		int mid;
		while(start <= end) {
			mid = (start + end) / 2;
			if(list[mid] > num) {
				end = mid - 1;
			} else if(list[mid] < num) {
				start = mid + 1;
			} else {
				answer = 1;
				break;
			}
		}
		return answer;
	}
}

먼저 리스트를 오름차순 정렬한 다음

찾아야하는 숫자를 하나씩 이분 탐색으로 살펴보았다.

반응형
Comments