수 찾기 (백준 1920)
2023. 1. 2. 13:52
1초 | 128 MB |
문제
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안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -2^31 보다 크거나 같고 2^31 보다 작다.
출력
M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.
<생각의 흐름>
N이랑 M의 최대가 100000이라 O(n^2)보다는 빠른 알고리즘 필요할듯??
이진 탐색을 적용하면 O(nlogn) 시간복잡도로 해결할 수 있음
이진 탐색은 정렬을 가정하므로 정렬 함수도 사용합니다 (자바의 기본정렬도 가능)
이 문제에서는 O(MlogN)임
<코드>
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] A = new int[N];
for(int i = 0 ; i < N ; i++){
A[i] = sc.nextInt();
}
Arrays.sort(A);
int M = sc.nextInt();
for(int i = 0 ; i < M ; i++){
boolean find = false;
int target = sc.nextInt();
int start = 0;
int end = A.length -1;
while(start <= end){
int mid_index = (start+end)/2;
int mid_value = A[mid_index];
if(mid_value > target){
end = mid_index-1;
}else if(mid_value < target){
start = mid_index + 1;
}else{
find = true;
break;
}
}
if(find) System.out.println(1);
else System.out.println(0);
}
}
}
<피드백>
이진 탐색 하는 방법 숙지 (쉬움 )
'코테뿌수기 - java > 문제 풀기' 카테고리의 다른 글
잃어버린 괄호 (백준 1541) (0) | 2023.01.03 |
---|---|
동전 0 (백준 11047) (0) | 2023.01.03 |
미로 탐색 (백준 2178) (0) | 2023.01.02 |
연결 요소의 개수 (백준 11724) (0) | 2023.01.02 |
소트인사이드 (백준 1427) (0) | 2023.01.01 |