📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

[백준 2805번] 나무 자르기 본문

코딩테스트/백준

[백준 2805번] 나무 자르기

seung_ho_choi.s 2025. 4. 1. 21:12
728x90

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

 

수정전

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());


        List<Integer> tree = new ArrayList<>();
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            tree.add(Integer.parseInt(st.nextToken()));
        }
        int answer = 0;
        int compare = 0;
        Collections.sort(tree, Collections.reverseOrder());
        int begin = tree.get(0);
        int last = tree.get(tree.size() - 1);

        int cnt =0;
        while (compare !=M) {
            answer = (begin + last) / 2;

            compare = 0;
            for (int i = 0; i < tree.size(); i++) {
                if (tree.get(i) > answer) {
                    compare += (tree.get(i) - answer);
                }else{
                    break;
                }
            }

            if (compare > M) {
                last = answer;
            } else if (compare < M) {
                begin = answer;
            }

        }

        System.out.println(answer);
    }
}

 

수정후

package datastructure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class DataStructure2805 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());


        int[] tree = new int[N];
        int max = 0;
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            tree[i] = Integer.parseInt(st.nextToken());
            if (tree[i] > max) {
                max = tree[i];
            }
        }
        int answer = 0;
        int left = 0;
        int right = max;


        while (left <= right) {
            int mid = (left + right) / 2;
            long total = 0;
            for (int i = 0; i < tree.length; i++) {
                if (tree[i] > mid) {
                    total += tree[i] - mid;
                }
            }

            if (total >= M) {
                left = mid + 1;
                answer = mid;
            } else if (total < M) {
                right = mid - 1;
            }

        }

        System.out.println(answer);
    }
}

 

 

큰 값, 작은 값 합쳐서 중간값 구한 후 계속해서 중간 값을 구하면 해결할 줄 알았으나.... 시간 초과!!! 문제를 자세히 읽어보니 필자가 잘못 읽었다... ㅎㅎㅎ 적어도 M 그 뜻은 M 이거나 M보다 커야 된다. 그때 최댒값을 구하면 된다. 

 

따라서 left와 right로 비교를 해준뒤 최대값을 향해서 루프를 돌면 되는 간단한 문제이다. 참고로 left +1, right -1을 해주는 이유는 만약 left가 12이고 right 13일때 계속 무한루프에 빠질 수 있기 때문이다. 그래서 각각 더해주고 뺴줘야지 성립이 된다. 

728x90

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

[백준 3190번] 뱀  (0) 2025.04.01
[백준 11052번] 카드 구매하기  (0) 2025.03.25
[백준 2156번] 포도주 시식  (0) 2025.03.25
[백준 15666번] 로봇 조종하기  (0) 2025.03.24
[백준 15666번] N과 M(12)  (0) 2025.03.23