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

최근 글

태그

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

최근 댓글

인기 글

hELLO
HelloMinchan
Deprecated

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

[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
  • [Baekjoon Online Judge] 백준 2805번 나무 자르기
  • (Python)
  • 백준 2805번 나무 자르기
'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.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.