설명
임의의 N개의 수를 오름차순으로 정렬한 다음 M이 주어지면
이분검색으로 M이 정렬된 상태에서 몇 번째에 있는지 구하는 프로그램을 작성하세요.
단 중복값은 존재하지 않습니다.
입력
첫 줄에 한 줄에 자연수 N(3<=N<=1,000,000)과 M이 주어집니다.
두 번째 줄에 N개의 수가 공백을 사이에 두고 주어집니다.
출력
첫 줄에 정렬 후 M의 값의 위치 번호를 출력한다.
풀이.
import java.util.Arrays;
import java.util.Scanner;
// ## 이분검색 (이분탐색) ##
// 이분검색은 무조건 정렬이 되어 있어야 가능하다.
// 이분검색 하면 left,middle,right 생각하라!
// left = 0 , right = n-1 , middle = (lt+rt)/2
public class Main {
void Solution(int n, int m, int[] arr){
// 이분검색은 무조건 "정렬"이 되어 있어야 가능하다. (오름 or 내림)
Arrays.sort(arr);
int result = 0;
int left = 0, right = n-1;
while(left <= right){ // 작거나 같을 떄까지 돌린다.
int middle = (left+right)/2;
// 찾았다. -> brake;
if(arr[middle] == m) {
result = middle+1;
break;
// middle보다 m이 작다. -> right를 좌측으로 이동.
}else if(arr[middle] > m) {
right = middle-1;
middle = (left+right)/2;
// middle보다 m이 크다. -> left를 우축으로 이동.
}else{
left = middle+1;
middle = (left+right)/2;
}
}
System.out.println(result);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
Main T = new Main();
T.Solution(n, m, arr);
}
}
정리 :
1. 이분검색은 무조건 정렬이 되어 있어야 가능하다.
2. 이분검색 하면 left, middle, right.
3. left = 0 , right = n-1 , middle = (left+right)/2
'Algorithm' 카테고리의 다른 글
[Algorithm] DFS(부분집합 구하기) (0) | 2021.07.10 |
---|---|
[Algorithm] 재귀함수 기본(팩토리얼, 피보나치수열) (0) | 2021.07.10 |
[Algorithm] 좌표정렬(Comparable, compareTo) (0) | 2021.07.07 |
[Algorithm] 배열 비교(clone, sort 활용) (0) | 2021.07.06 |
[Algorithm] 중복 확인(Stack, HashMap, Array) (0) | 2021.07.06 |