백준/ Silver 3 문제 , 백준 파이썬 2805 , 나무 자르기
Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하
<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
<덧붙일 말>
개빡치는 문제였다. 시간초과와의 사투로 고전함....
<문제 출처>
https://www.acmicpc.net/problem/2805
------------------------------------------------------------------------------------------------------------------------------
진짜 시간초과가 자꾸나서 뭐가 틀린지 몰랐는데
https://deep-learning-study.tistory.com/603
이 분 블로그를 참고해보니
코드의
import sys
input=sys.stdin.readline
N,M=map(int,input().split())
Trees=list(map(int,input().split()))
low, high = 0, max(Trees)
while low <= high:
cut=(low+high)//2
sum=0
for tree in Trees:
if tree>cut:
sum+=tree-cut
if sum >= M:
low=cut+1
else:
high=cut-1
print(high)
마지막 부분
if sum < M:
high=cut-1
else:
low=cut+1
이 부분에서 문제가 있었다. 이걸
if sum >= M:
low=cut+1
else:
high=cut-1
이렇게 위아래 조건 순서를 바꿔주니 통과가 되었다 ㅎㅎㅎㅎㅎ (아오.... )
이 문제에서 핵심은
cut=(low+high)//2
이 코드와
if sum >= M:
low=cut+1
else:
high=cut-1
이 코드이다.
cut=(start+end)//2
로 중간값부터 설정해준 뒤 이 값을 줄일지 말지의 격차를 빠르게 판단하여 연산 회수를 최소화한다.
if sum >= M:
low=cut+1
else:
high=cut-1
잘라낸 sum 이란 값이 원하던 값 M 보다 크다면 low 값에 1을 더해줘 자를 값을 줄여주고
반대로, M보다 작다면 high 값에 -1 을 해줘서 자를 값을 늘려준다.
아무래도 이 코드가 시간 초과가 안나고 통과된 것은 else 문보다 if 문에 해당되는 수들이 많아 조금이라도 더 빠르게 수행이되지않았나 싶다.
------------------------------------------------------------------------------------------------------------------------------
정답
'알고리즘 공부 > 백준 - 파이썬' 카테고리의 다른 글
백준/ Silver 3 문제 , 백준 파이썬 2512 , 예산 (0) | 2022.02.03 |
---|---|
백준/ Silver 3 문제 , 백준 파이썬 1654 , 랜선 자르기 (0) | 2022.02.03 |
백준/ Silver 1 문제 , 백준 파이썬 9020, 골드바흐의 추측 (0) | 2022.02.03 |
백준/ Silver 5 문제 , 백준 파이썬 11653 , 소인수분해 (0) | 2022.02.03 |
백준/ Silver 4 문제 , 백준 파이썬 2108 , 통계학 (0) | 2022.02.02 |