[Boj 1920] 수 찾기

eunsol Jo·2021년 9월 18일
0

🧁  Algorithm

목록 보기
2/4
post-thumbnail

📎 문제링크

1. 시간복잡도

N(1 ≤ N ≤ 100,000), M(1 ≤ M ≤ 100,000) 범위이므로, 이중for를 돌리게 되면 시간초과가 된다.

O(NM)=1010100secO(N*M) = 10^{10} → 100sec

이분탐색을 으로 시간초과를 피할 수 있다.

O(log2N)O(M)=(log2105)105=1,661,0000.016secO(log_2N)*O(M) = (log_210^5)*10^5 = 1,661,000 → 0.016sec

2. 풀이

2.1 범위체크

모든 정수의 범위는 231-2^{31} 보다 크거나 같고 2312^{31}보다 작다. ➡️ int형의 범위

2.2 left, right 갱신 주의

양 끝점을 단순히 mid로 갱신을 해주면 무한루프에 빠질 수 있다.
if (target[mid] == ele[i]) 조건을 통해 mid는 답이 될 수 없음을 확인 하였으므로 left, right 갱신시에 left = mid+1; right = mid-1; 와 같이 한 칸씩 추가로 이동을 해주어 범위를 좁혀 나가야 한다.

3. 코드

package week10;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Boj_1920 {
    static int N, M;
    static int[] target, ele, answer;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        N = Integer.parseInt(br.readLine());
        target = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        M = Integer.parseInt(br.readLine());
        ele = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        Arrays.sort(target);

        int left, right, mid, result;
        for (int i = 0; i < ele.length; i++) {
            left = 0;
            right = target.length-1;
            result = 0;

            while (left <= right) {
                mid = (left+right)/2;

                if (target[mid] == ele[i]) {
                    result = 1;
                    break;
                }

                if (target[mid] < ele[i]) {
                    left = mid+1;
                } else {
                    right = mid-1;
                }
            }
            sb.append(result + "\n");
        }

        System.out.println(sb.toString());

    }
}
profile
Later never comes 👩🏻‍💻

0개의 댓글