알고리즘 종류 : 이진탐색

수찾기

시간 제한 메모리 제한
1초 256MB

 

문제

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 {
	private int N;
	private int M;
	private final int MAX = 100010;
	private int[] numbers = new int[MAX];

	public static void main(String[] args) {
		Main main = new Main();
		try {
			main.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void start() throws Exception {
		Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
		for (int i = 0; i < N; i++) numbers[i] = sc.nextInt();
		M = sc.nextInt();
		
		Arrays.sort(numbers, 0, N);
		for (int i = 0; i < M; i++) {
			int target = sc.nextInt();
			System.out.println(binarySearch(target) ? 1 : 0);
		}
	}

	private boolean binarySearch(int target) {
		boolean found = false;
		int s = 0, e = N - 1;
		while (s <= e) {
			int divide = (s + e) / 2;
			if (numbers[divide] == target) {
				found = true;
				break;
			} else if (numbers[divide] < target) {
				s = divide + 1;
			} else {
				e = divide - 1;
			}
		}
		return found;
	}
    
    private int binarySearchRecursive(int s, int e, int target) {
		if(s == e) {
			return numbers[s] == target ? s : -1;
		} else if (s > e) {
			return -1;
		}
		
		int mid = (s + e) / 2;
		if(numbers[mid] < target) {
			return binarySearch(mid+1, e, target);
		} else if(numbers[mid] > target){
			return binarySearch(s, mid-1, target);
		} else {
			return mid;
		}
	}
}

 


출처

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

+ Recent posts