코딩테스트
[정렬] 8. 이분검색
개발하는지호
2024. 1. 20. 21:45
<<풀이>>
-나의 풀이-
문제는 이분검색이라는 방식을 사용해서 하는 것 같지만 일단 이분 검색을 잘 모르기 때문에 다른 방식으로 풀어봤다.
Arrays.sort를 통해서 정렬 한 뒤에 for문을 돌려 같은 값이 나오면 그 인덱스 값을 반환하는 방식을 사용해서 구할 수 있었다.
import java.util.Arrays;
import java.util.Scanner;
class Main {
private int solution(int n, int m, int[] arr) {
Arrays.sort(arr);
for(int i = 0; i < n; i++) {
if(arr[i] == m) return i + 1;
}
return -1;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
System.out.println(T.solution(n, m , arr));
}
}
여기서 시간 복잡도를 생각한다면 break를 활용할 수도 있다.
import java.util.Arrays;
import java.util.Scanner;
class Main {
private int solution(int n, int m, int[] arr) {
Arrays.sort(arr);
int answer = 0;
for(int i = 0; i < n; i++) {
if(arr[i] == m) {
answer = i + 1;
break;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
System.out.println(T.solution(n, m , arr));
}
}
-강사님 풀이-
강사님은 이분 검색을 활용해서 문제를 풀었다. 이분 검색이란 먼저 정렬을 한 뒤에, 가장 앞쪽 값을 lt로 마지막 값을 rt로 지정한 뒤에
mid = lt + rt / 2 를 하고 그 인덱스에 위치한 값이 우리가 찾는 것이면 그대로 그값을 반환하고 return을 한다. 하지만 그게 아니고 구하려는 값이
현재 위치의 값보다 더 큰 값이면 그 밑에 있는 쪽은 무시하고 위쪽을 검색한다. 즉, lt 값을 mid + 1로 바꿔준다.
반대이면 위쪽을 무시하고 아래쪽을 검색한다. 즉, rt값을 mid - 1 해준다.
그 과정을 lt <= rt 일 때 까지 해준다.
import java.util.Arrays;
import java.util.Scanner;
class Main {
private int solution(int n, int m, int[] arr) {
int answer = 0;
Arrays.sort(arr);
int lt = 0, rt = n - 1;
while(lt <= rt) {
int mid = (lt + rt) / 2;
if(arr[mid] == m) {
answer = mid + 1;
break;
}
if(arr[mid] > m) rt = mid - 1;
else lt = mid + 1;
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
System.out.println(T.solution(n, m , arr));
}
}
이분 검색 방식으로 시간복잡도를 조금 더 줄일 수 있다.!!
오늘도 좋은 개념을 배우고 갑니다~!