Algorithm - Binary Search

  • 2023-12-13 에 풀이한 문제
  • 풀이 시간 : 09:10 ~ 09:27



알고리즘 문제(Java) : 이진 탐색 ( 배열 )


1. 문제

임의의 N개의 숫자가 입력으로 주어집니다.
N개의 수를 오름차순으로 정렬한 다음 N개의 수 중 한 개의 수인 M이 주어지면
이분검색으로 M이 정렬된 상태에서 몇 번째에 있는지 구하는 프로그램을 작성하세요.
단 중복값은 존재하지 않습니다.



2. 입력

  • 첫 줄에 한 줄에 자연수 N(3<=N<=1,000,000)과 M이 주어집니다.
  • 두 번째 줄에 N개의 수가 공백을 사이에 두고 주어집니다.



3. 출력

  • 첫 줄에 정렬 후 M의 값의 위치 번호를 출력한다.



4. 문제 풀이

  • 배열에서 이진 탐색을 하는 방법은, 먼저 Arrays.sort(arr); 를 활용하여 정렬을 해준다.
  • 만약 내림차순이라면 Boxing을 통해 Wrapper 타입으로 만들어 준 후, Arrays.sort(arr, Collections.reverseOrder()); 를 해준다.
  • 그 후, 범위를 지정한다.
    • 처음에는 배열 전체의 가운데를 선택할 것이기 때문에, lt = 0, rt = 배열길이 - 1 을 해준다.
  • int mid = (lt + rt) / 2로 가운데 배열을 구한다.
  • arr[mid] 가 내가 구하려는 값이라면 return 해주고, 그게 아니라면 내가 구하려고 하는 수와 비교한다.
    • arr[mid] > m 이라면 내가 구하려는 수보다 현재 수가 크니까 rt를 좁히고,
    • arr[mid] < m 이라면 내가 구하려는 수보다 현재 수가 작은거니까 lt를 좁힌다.
  • 좁힌 범위에서 다시 가운데를 구하고, 동일하게 비교해준다.
  • 아래 코드에서는 answer 를 0으로 시작했지만, 문제에 따라 없을 경우 -1을 return 하라는 조건이 붙기도하니 잘 확인해야 한다.
public class Binary_Search {

    public static int solution(int n, int m, int[] arr) {
        int answer = 0;
        Arrays.sort(arr);
        int lt = 0;
        int rt = n-1;

        while (lt <= rt) {
            int mid = ( lt + rt ) / 2;
            if ( arr[mid] == m ) {
                answer = mid + 1;
                break;
            }
            else if ( arr[mid] < m ) {
                lt = mid + 1;
            } else {
                rt = mid - 1;
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int m = scan.nextInt();
        int[] arr = new int[n];
        for ( int i=0; i<n; i++ ) {
            arr[i] = scan.nextInt();
        }
        System.out.println(solution(n, m, arr));
    }

}






results matching ""

    No results matching ""