개발 무지렁이

[문제풀이] B1920 수찾기 본문

코딩 테스트/문제풀이

[문제풀이] B1920 수찾기

Gaejirang-e 2023. 3. 20. 17:50

수찾기


  🪅 중첩 for문을 도는 것 대신, 다른 시간복잡도가 낮은 탐색과정을 알고있는가
  🪅 이진탐색을 위한 조건을 알고 있는가 => 정렬되어 있어야한다.
  🪅 이진탐색을 구현할 수 있는가

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[] arr;
    public static int binarySearch(int target) {
        int low = 0;
        int high = arr.length - 1;
        while(low <= high) {
            int mid = (low + high)/2;
            if(arr[mid] == target) {
                return 1;
            } else if(arr[mid] < target) {
                low = mid+1;
            } else {
                high = mid-1;
            }
        }
        return 0;
    }
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        arr = new int[N];
        StringTokenizer token = new StringTokenizer(br.readLine(), " ");
        for(int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(token.nextToken());
        }
        Arrays.sort(arr);
        int M = Integer.parseInt(br.readLine());
        token = new StringTokenizer(br.readLine(), " ");
        for(int i = 0; i < M; i++) {
            int cur = Integer.parseInt(token.nextToken());
            int res = binarySearch(cur);
            System.out.println(res);
        }
    }
}

💡 문제 접근 과정
N과 M은 각각 최대 100_000까지 나올 수 있다.
즉, 최대 100_000개(M)를 하나하나 100_000개(N) 중에서 있는지 확인해야하니까 중첩for문을 돌게 되고,
1억번의 연산을 확연히 뛰어넘는다.
따라서 시간초과가 날 것이고, 시간복잡도가 O(logN)인 이진탐색을 이용해야겠다 싶었다.
이진탐색은 정렬된 상태여야 하니 Arrays.sort()로 정렬해주고, 연습삼아 이진탐색을 구현하였다.

📌 Arrays.binarySearch(arr, 탐색값)을 이용하면 쉽게 구현가능하다

'코딩 테스트 > 문제풀이' 카테고리의 다른 글

[문제풀이] B10986 나머지합  (0) 2023.03.21
[문제풀이] B2493 탑  (0) 2023.03.21
[문제풀이] B2178 미로탐색  (0) 2023.03.20
[문제풀이] B2164 카드2  (1) 2023.03.19
[문제풀이] B1874 스택수열  (0) 2023.03.19
Comments