알고리즘 종류 : 이진탐색
수찾기
시간 제한 | 메모리 제한 |
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;
}
}
}
출처
'알고리즘' 카테고리의 다른 글
투포인터/두 용액 백준 2470번 (0) | 2022.01.22 |
---|---|
이진탐색/숫자카드 백준 10815번 (0) | 2022.01.15 |
백트래킹/부등호 백준 2529번 (0) | 2021.12.06 |
백트래킹/Dessert USACO 2002 poj 1950 (0) | 2021.11.22 |
기본정수론/벌집 백준 2292번 (0) | 2021.11.16 |