백준 1920 수 찾기 문제풀이 (JAVA)

0

문제 링크

문제


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 ~ 100의 수 중 30을 찾는다고 가정해보자
가운데 수인 50을 기점을 두고, 만약 찾는 숫자가 기점보다 작으면 1~50 에서 찾고, 그렇지 않으면 51~100에서 찾고, 만약 기점과 수가 같으면 출력한다.
30은 50보다 작으니 1~ 50에서 찾고,
해당 수의 절반인 25를 기점을 두고, 찾는 수와 기점에 있는 수와 비교한다.
해당 범위를 점점 좁혀, 찾는 수가 존재하는 지 여부를 파악하면 된다.

소스코드


import java.util.*;
import java.io.*;
public class Main{
    public static int recode[];
    public static void main(String [] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        final int NUMBER_OF_INPUT =  Integer.parseInt(br.readLine());
        recode = new int [NUMBER_OF_INPUT];
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0;i<NUMBER_OF_INPUT;i++) {
            recode[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(recode);
        
        final int NUMBER_OF_REQUEST =  Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        int temp, start,middle,finish;
        boolean isHave[] = new boolean [NUMBER_OF_REQUEST];
        for(int i=0;i<NUMBER_OF_REQUEST;i++) {
            temp = Integer.parseInt(st.nextToken());
            start = 0;
            finish = NUMBER_OF_INPUT-1;
            while(start <= finish) {
                middle = (start+finish)/2;
                if(recode[finish]==temp){
                    isHave[i] = true;   
                }
                
                if(recode[middle]>temp) {
                    finish = middle-1;
                }else if(recode[middle]==temp){
                   isHave[i] = true;
                    break;
                }else{
                    start = middle+1;
                }
            }
            if(isHave[i]){
                bw.write("1\n");
            }else{
                bw.write("0\n");
            }
        }
        
	br.close();
        bw.flush();
        bw.close();
    }

}

0개의 댓글