코테/백준

99클럽 코테 스터디 2일차 TIL 이분탐색(징검다리)

zsunny 2024. 10. 29. 15:25

https://www.acmicpc.net/problem/11561

 

 

 

처음에 이분탐색이라는 아이디어를 떠올리는 게 어려운 문제였다,,

근데 자세히 보면 N의 범위로 보아 선형탐색은 절대 아니고, 두 번째 점프부터 이전 점프 + 1 긴 거리를 점프한다는 점에서 등차수열을 떠올릴 수 있다.

그리고 최대 수이니 결국은 무조건 다음 식을 만족한다. => 다음 점프 = (이전 점프 + 1)

그렇다면, 몇 개의 징검다리를 건넜을 때가 최대 징검다리가 될 까? 이 징검다리 수를 m으로 두고 이분탐색을 통해 조건을 만족하는 최대 m 값을 구하면 된다.

그리고 조건은, m * (m + 1) / 2기 N의 값에 가장 가까우면 된다. (등차수열의 합 공식 사용)

주의점은 N의 최대 범위를 고려하여 자료형을 long으로 사용해야 한다.

 

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_11561 {

    static int T;
    static long N;
    static long ans;

    public static void binarySearch(long s, long e, long target){
        if(s > e) return;
        long m = (s + e) / 2;
        long sum = m * (m + 1) / 2;
        if(sum <= target) {
            ans = m;
            binarySearch(m+1, e, target);
        }else{
            binarySearch(s, m-1, target);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        T = Integer.parseInt(st.nextToken());
        while(T --> 0){
            st = new StringTokenizer(br.readLine());
            N = Long.parseLong(st.nextToken());
            binarySearch(0, (long)Math.sqrt(2*N-1), N);
            System.out.println(ans);
        }
    }
}

'코테 > 백준' 카테고리의 다른 글

[BOJ] 2343 기타레슨 (Java)  (0) 2024.10.30
[BOJ] 2512 예산 (Java)  (0) 2024.10.29
[BOJ] 2776 암기왕 (Java)  (0) 2024.10.28
99클럽 코테 스터디 1일차 TIL 이분탐색(게임)  (0) 2024.10.28
[BOJ] 2644 촌수계산 (Java)  (0) 2023.04.30