백준 1920 수 찾기 문제풀이 (JAVA)
문제
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();
}
}
Author And Source
이 문제에 관하여(백준 1920 수 찾기 문제풀이 (JAVA)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@phjppo0918/백준-1920-수-찾기-문제풀이-JAVA저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)