본문 바로가기
알고리즘

백준_2805_나무 자르기(이분 탐색)

by 매화of사군자 2020. 2. 15.

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

 

2805번: 나무 자르기

문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기을 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따

www.acmicpc.net

해결 방법

> 이분 탐색을 이용한다.

 

이분 탐색

- 탐색기법중에 탐색 범위를 반으로 나누어 탐색함에 따라 시간이 절약되는 탐색기법이다.

> left, right(최소, 최대값)을 설정한다.

> mid = (left + right)/2를 설정한다.

> mid와 target을 비교한다.

> mid < target 이면 left = mid + 1로 설정한다.

> mid > target 이면 right = mid - 1로 설정한다.

> mid == target 이면 반복문을 탈출한다.

> left > right가 될 때 까지 위의 과정을 반복한다.

 

출처 : https://wootool.tistory.com/62

후기

> python3로 제출하니까 시간초과가 떴다.

> pypy3로 제출하라는 조언을 듣고 pypy3로 제출하니 통과되었다.

 

참고 자료

> What is pypy

https://pypy.org/performance.html 

 

Performance

Contents Profiling: vmprof Optimization strategy Micro-tuning tips This document collects strategies, tactics and tricks for making your code run faster under PyPy. Many of these are also useful h

www.pypy.org

> python vs pypy

https://m.blog.naver.com/PostView.nhn?blogId=lsm_origin&logNo=120210926900&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

python 을 더욱 힘세고 강하게! PyPy (pypy)

Python 은 엄청난 생산성을 가진다. 오죽하면 언어의 모토가 "Life is Short, You need Python." 이겠...

blog.naver.com

> 정확하진 않지만 객체 메소드 호출에 있어서는 python이 더 빠를수도 있다.

https://www.acmicpc.net/board/view/32552

 

글 읽기 - 제코드가 pypy3 보다 python3에서 훨씬 빠른 이유가 뭔가요?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

코드

더보기

import sys

 

input = sys.stdin.readline

 

n, m = map(intinput().split())

tall = list(map(intinput().split()))

 

left, right = 0max(tall)

 

while left <= right:

    mid = (left + right) //2

    total = 0

    for i in tall:

        if i >= mid:

            total = total + (i - mid)

    if total > m:

        left = mid + 1

    elif total < m:

        right = mid - 1

    else:

        print(mid)

        sys.exit()

print(right)

댓글