https://www.acmicpc.net/problem/2417
코드설명
이분탐색을 활용하여 해결합니다.
1부터 N까지의 숫자들을 이분탐색으로 순회하면서 해당 middle에 있는 값의 제곱이 N보다 크거나 같으면, end = middle - 1 처리를 통해 값을 줄여주면서 middle 값의 제곱이 N보다 크거나 같게 해주는 가장 최소한의 수를 찾아줍니다.
이 과정에서 N보다 크거나 같은 최소한의 수를 찾기 위해
먼저 >= N 처리를 해주어야만, end가 middle - 1 처리로 어들면서 최소한의 수를 찾을 수 있습니다.
if( Math.pow(middle, 2) >= N ) {
answer = middle;
end = middle - 1;
} else {
start = middle + 1;
}
Math.sqrt로 N의 제곱근을 구한뒤, N보다 작다면 + 1, 같거나 크다면 그대로 출력해도 됩니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static long N, M, K = 0;
public static long answer = 0;
public static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Long.parseLong(st.nextToken());
binarySearch(0, N);
System.out.println(answer);
}
public static void binarySearch(long start, long end) {
long left = 0;
long right = end;
while(left <= right) {
long middle = (left + right) / 2;
if( Math.pow( middle, 2) >= N) {
answer = middle;
right = middle - 1;
}
else if(Math.pow(middle, 2) < N){
left = middle + 1;
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static long N;
public static long answer = 0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Long.parseLong(st.nextToken());
binarySearch();
System.out.println(answer);
}
public static void binarySearch() {
long start = 0;
long end = N;
while(start <= end) {
long middle = ( start + end ) / 2;
if( Math.pow(middle, 2) >= N ) {
answer = middle;
end = middle - 1;
} else {
start = middle + 1;
}
}
}
}
'알고리즘 > binary_search' 카테고리의 다른 글
[백준] 19637 IF문 좀 대신 써줘 - 이분탐색(binary search) + 시간초과 JAVA (0) | 2023.07.27 |
---|---|
[백준] 2512 예산 - 파라메트릭 서치(Paramatric Search) JAVA (0) | 2023.07.27 |
[백준] 10815 숫자 카드 - 이분탐색(binary search) JAVA (0) | 2023.07.26 |
[백준] 10816 숫자 카드 2 - 이분탐색(binary search) JAVA (0) | 2023.07.19 |
[백준] 1920 수 찾기 - 이분탐색(binary search) JAVA (0) | 2023.07.19 |