HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • 데이터베이스
  • Baekjoon Online Judge
  • back-end
  • Algospot
  • 개발자
  • 프로그래머스Python
  • front-end
  • 알고스팟Python
  • 프로그래머스
  • 프로그래머스C++
  • programmers
  • 백준Python
  • 알고스팟
  • 백준Go
  • 프로그래밍
  • 백준C++
  • 코딩
  • 백준
  • Database
  • 백엔드

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[Baekjoon Online Judge] 백준 2805번 나무 자르기(Python)
Deprecated

[Baekjoon Online Judge] 백준 2805번 나무 자르기(Python)

2020. 4. 4. 23:51

© 2020 All Rights Reserved. 주식회사 스타트링크

[Baekjoon Online Judge] 백준 2805번 나무 자르기

(Python)

(글쓴날 : 2020.04.04)

 


* Baekjoon Online Judge, 백준 2805번 문제 Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

백준 2805번 나무 자르기


1) 문제

문제 링크 : https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

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

www.acmicpc.net


2) 풀이 과정

나무들의 높이가 주어지고, 각 나무들을 절단기를 통해 같은 높이로 자를 때 원하는 나무의 길이를 만족하는 절단기 높이의 최댓값을 출력하는 문제입니다.

 

저의 경우, 이분 탐색 알고리즘인 파라메트릭 서치를 적용하여 문제를 해결했습니다.

먼저, 나무의 최저 높이와 최고 높이를 구해, 최저 높이가 최고 높이 보다 작거나 같을 때까지 반복문을 돌리고 해당 값들의 중간 값을 절단기의 높이로 지정합니다.

만약, 절단한 나무길이의 합이 원하는 길이 보다 작다면 최고 높이를 중간값 - 1로 지정해 다시 반복하고, 크다면 가장 큰 중간값을 갱신해 저장한 뒤 최저 높이를 중간값 + 1로 지정하여 반복합니다.

그렇게 계속 반복하다가 만약 원하는 나무길이와 딱 떨어진다면 해당 중간값이 절단기에 설정할 수 있는 최댓값이므로 출력 후 바로 종료하고, 그렇지 않고 반복문을 빠져나왔다면 저장되어 있는 가장 큰 중간값이 절단기에 설정할 수 있는 최댓값이 됩니다.

 

제 방식은 Python 3로 제출 시 시간 초과가 발생하며, PyPy3로 제출 시 정답으로 인정됩니다.

요새 들어, PS 언어를 Python에서 C++로 갈아타야 하나 고민이 됩니다...


3) 코드

 

* Python 코드(PyPy3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys
input = sys.stdin.readline
 
N, M = map(int, input().split())
trees = list(map(int, input().split()))
left = 0
right = max(trees)
maxCut = 0
 
while left <= right:
    getTree = 0
    mid = (left + right) // 2
 
    for tree in trees:
        if tree - mid < 0:
            continue
        getTree += tree - mid
 
    if getTree == M:
        print(mid)
        sys.exit()
    elif getTree < M:
        right = mid - 1
    else:
        if maxCut < mid:
            maxCut = mid
        left = mid + 1
        
print(maxCut)

 

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 2512번 예산(Python)  (0) 2020.04.06
[Baekjoon Online Judge] 백준 1654번 랜선 자르기(Python)  (0) 2020.04.06
[Baekjoon Online Judge] 백준 9663번 N-Queen(Python)  (1) 2020.04.04
[Baekjoon Online Judge] 백준 14888번 연산자 끼워넣기(Python)  (5) 2020.04.03
[Baekjoon Online Judge] 백준 15652번 N과 M (4)(Python)  (0) 2020.04.02
    'Deprecated' 카테고리의 다른 글
    • [Baekjoon Online Judge] 백준 2512번 예산(Python)
    • [Baekjoon Online Judge] 백준 1654번 랜선 자르기(Python)
    • [Baekjoon Online Judge] 백준 9663번 N-Queen(Python)
    • [Baekjoon Online Judge] 백준 14888번 연산자 끼워넣기(Python)
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바