본문 바로가기
알고리즘/코드트리 문제풀이

코드트리 [자바 java] 숫자 빠르게 찾기

by 잔디🌿 2023. 9. 8.

https://www.codetree.ai/missions/8/problems/find-number-fast?&utm_source=clipboard&utm_medium=text 

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

이 문제는 배열 내에서 이진탐색을 이용해서 주어진 수를 빠르게 찾아 출력해야합니다.

나는 일반적인 이진탐색 방법으로 문제를 풀었다.

우선, 배열에 주어진 수를 배열에 넣고 정렬했습니다. 그 다음, 현재 탐색하고 있는 부분배열의 왼쪽과 오른쪽을 나타내는 변수를 각각 설정한 다음 이 두 인덱스의 가운데 값을 원하는 값과 비교해서 더 크다면 왼쪽을 나타내는 변수를 mid + 1로 설정하였고, 더 작다면 오른쪽을 나타내는 변수를 mid-1하였다.

 

 

import java.io.*;
import java.math.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        //int[] arr= new int[100000];

        int[] arr = new int[n];
         st = new StringTokenizer(br.readLine());

        for(int i = 0;i<n;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);

        for(int i = 0;i<m;i++){
            int a = Integer.parseInt(br.readLine());
            int left = 0;
            int right = n-1;
            int mid = 0;

            while(left <= right){
                mid = (left + right) /2;
                if(arr[mid] == a) {
                    sb.append((mid+1) + "\n");
                    //System.out.println(mid);
                    break;
                }
                else{
                    if(arr[mid] < a){
                        left = mid + 1;
                    }
                    else{
                        right = mid -1;
                    }
                }
            }

            if(left > right){
                sb.append(-1 + "\n");
             }     
            }

        System.out.println(sb);
        


    }
}