[백준] 수 찾기 1920번

나의 풀이

public class FindNumber {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        int[] n_nums = Arrays.stream(br.readLine().split(" ")).mapToInt(i -> Integer.parseInt(i)).sorted().toArray();
        int M = Integer.parseInt(br.readLine());
        int[] m_nums = Arrays.stream(br.readLine().split(" ")).mapToInt(i -> Integer.parseInt(i)).toArray();

        for(int i = 0; i < M; i++) {
            if(binary_search(n_nums, m_nums[i], 0, N - 1)) {
                System.out.println(1);
            } else {
                System.out.println(0);
            }
        }
    }

    static private boolean binary_search(int[] arr, int target, int start, int end) {
        while(start <= end) {
            int mid = (start + end) / 2;

            if(arr[mid] == target) {
                return true;
            } else if(arr[mid] > target) {
                end = mid - 1;
            } else if(arr[mid] < target) {
                start = mid + 1;
            }
        }

        return false;
    }
}
  • 이분 탐색(Binary Search):
    • 이분 탐색을 하기 전에 리스트는 오름차순 정렬이 되어 있어야 한다.
    • 해당 리스트의 중간 값을 기준으로 리스트의 시작과 끝을 조절하는 방식이다.
    • 중간 값과 같으면 해당 해당 인덱스를 반환한다.
    • 중간 값 보다 찾는 값이 더 크다면 시작점을 중간 + 1 로 옮기고 다시 탐색을 시작한다.
    • 중간 값 보다 찾는 값이 더 작다면 끝점을 중간 - 1 로 옮기고 다시 탐색을 시작한다.
    • 위 과정을 값을 찾을 때 까지 반복하다가 시작점이 끝점을 초과하게 되면 값이 없는 것으로 반복을 종료한다.
  • 이분 탐색만 구현할 줄 알면 충분히 풀 수 있는 문제다.

0개의 댓글