본문 바로가기
Python/알고리즘문제

[백준 2805] 나무자르기

by 붕어사랑 티스토리 2021. 3. 11.
반응형

기억하자.

 

어떤 직선에서 특정값을 찾아야 한다 => 이분탐색 문제! logN

 

나무를 자르는 행위는 시간복잡도가 N이다

 

고로 이문제는 이분탐색 + 나무자르기로 NlogN에 풀 수 있다!

 

 

 

 

이분탐색 하는법

  • left와 right 값을 설정한다
  • mid값 기준으로 while(left <= right) 일 때 알고리즘을 수행한다
  • 값을 찾지 못하면 left에는 mid+1 값을 주거나 right에 mid -1 값을 주면서 계속 찾는다

 

 

c++

#include<iostream>


using namespace std;

int tree[1000001];
int N, M;
int main() {
	cin >> N >> M;
	int left = 1;
	int right = 0;
	for (int i = 1; i <= N; i++) {
		cin>>tree[i];
		right = right > tree[i] ? right : tree[i];
	}
	long long ans = 0;
	while (left<=right)
	{
		long long sum = 0;
		int mid = (left + right) / 2;

		for (int i = 1; i <= N; i++) {
			if (tree[i] > mid)sum += tree[i] - mid;
		}

		if (sum >= M) {
			left = mid + 1;
			ans = ans > mid ? ans : mid;
		}
		else {
			right = mid - 1;
		}

		
	}
	cout << ans << endl;


	return 0;
}

 

 

파이썬

import sys
N, M = map(int,sys.stdin.readline().split())

wood = list(map(int,sys.stdin.readline().split()))
wood.sort(reverse=True)

left  = 1
right = wood[0]
ans = 0
while(left <= right):
    mid = int((left + right) / 2)
    sum = 0
    for i in wood:
        if i > mid:
            sum += i - mid
        else:
            break

    if sum >= M:
        left = mid + 1
        ans = ans if ans > mid else mid
    elif sum < M:
        right = mid -1


print(ans)

 

반응형

'Python > 알고리즘문제' 카테고리의 다른 글

[프로그래머스][해시] 완주하지 못한 선수  (0) 2021.03.12
[백준 1463] 1로 만들기  (0) 2021.03.11
[백준 2606] 바이러스  (0) 2021.03.11
[백준 1753] 최단경로  (0) 2021.03.11
[백준 15649] N과 M (1)  (0) 2021.03.11

댓글