문제
https://www.acmicpc.net/problem/2776
2776번: 암기왕
연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며,
www.acmicpc.net
사고의 흐름
이중 포문으로 풀경우 : N x M 만해도 1000,000,000,000 시간초과가 날게 분명하다.
시간 복잡도를 줄일 수 있는 방법이 있을까..?
이분 탐색을 사용하자
이분 탐색을 사용하는 경우 MlogN이 되어 시간복잡도가 확 줄어든다.
풀이 코드
package 큰돌의터전알고리즘강의.three주차.암기왕;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int T;
static int N;
static int M;
static int[] nNote;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (T > 0) {
N = Integer.parseInt(br.readLine());
nNote = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
nNote[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(nNote); // 정렬
M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
int ret = solution(Integer.parseInt(st.nextToken()), 0, N - 1);
sb.append(ret + "\n");
}
T--;
}
System.out.println(sb.toString());
br.close();
}
static int solution(int n, int start, int end) { // 이분 탐색
int middle;
while (start <= end) {
middle = (start + end) / 2;
if (n == nNote[middle]) {
return 1;
} else if (nNote[middle] > n) {
end = middle - 1;
} else {
start = middle + 1;
}
}
return 0;
}
}
반복문을 사용하여 이분 탐색을 해주었다.
'Backend > 알고리즘' 카테고리의 다른 글
[백준] 2729번 - 보석상자 (0) | 2023.12.08 |
---|---|
이분탐색 (1) | 2023.12.07 |
[백준] 14888번 - 연산자 끼워넣기 (0) | 2023.11.30 |
[백준] 1911 - 흙길 보수하기 (1) | 2023.11.30 |
[백준] 15662 - 톱니바퀴 (0) | 2023.11.29 |