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 |