[백준/JAVA] 1920번: 수 찾기
🔺 문제
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
🔺 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[] A = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(A); // 이진 탐색 위해 정렬
// 존재하는지 비교할 숫자
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < M ; i++) {
boolean find = false;
int target = Integer.parseInt(st.nextToken());
int start = 0;
int end = A.length - 1;
while(start <= end) {
int mid = (start + end) / 2; // 중앙값
if(A[mid] > target) {
end = mid - 1;
}
else if(A[mid] < target) {
start = mid + 1;
}
else {
find = true;
break;
}
}
if(find) sb.append(1).append("\n");
else sb.append(0).append("\n");
}
System.out.println(sb);
}
}
✅ 해결 아이디어
- 이진 탐색 사용 (시간 복잡도 : O (nlogn))
💥 유의사항
⇨ 이진 탐색, 반드시 데이터가 정렬되어 있어야 함!
🔺 다른 풀이들
- 풀이1)
[백준] 1920번 : 수 찾기 - JAVA [자바]
https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음
st-lab.tistory.com
Arrays.binarySearch()
메소드를 사용한 풀이도 넣어주셨다.
- 풀이2)
[JAVA 자바] 백준 1920번 : 수 찾기
▶ 문제 https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진
jumping-to-the-water.tistory.com
재귀를 이용한 풀이도 볼 수 있당
💬 느낀 점
이분 탐색은 탐색 전 무조건 데이터 정렬이 필요하다!!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 6/12 |
(+6/12 2회독)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int[] A = new int[n];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < n ; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(A); // 이진 탐색 위해 정렬
int m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine()," ");
while(m --> 0) {
boolean find = false;
int target = Integer.parseInt(st.nextToken());
int s = 0;
int e = A.length - 1;
while(s <= e) {
int mid = (s + e) / 2; // 중앙값
if(A[mid] == target) {
find = true;
break;
}
else if(A[mid] < target) {
s = mid + 1;
}
else if(A[mid] > target) {
e = mid - 1;
}
}
sb.append(find ? 1 : 0).append("\n");
}
System.out.println(sb);
}
}
|
cs |