Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
Tags
- group by
- level 3
- Lv. 2
- 소프티어
- Lv. 0
- select
- programmers
- javascript
- 파이썬
- bfs
- 깊이 우선 탐색
- Python
- join
- 프로그래머스
- SQL
- SQL 고득점 KIT
- 너비 우선 탐색
- Lv. 1
- LEVEL 2
- Dynamic Programming
- softeer
- 동적계획법
- DP
- Lv. 3
- dfs
- 오블완
- Java
- C언어
- 자바스크립트
- 티스토리챌린지
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 {언어 : Python} 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/340212?language=python3
정답 코드
def solution(diffs, times, limit):
lenDT = len(diffs)
# 이분 탐색
minLev = 1
maxLev = 100000
while minLev <= maxLev:
level = (minLev+maxLev) // 2
currentTimes = times[0]
# 소요 시간 계산
for i in range(1, lenDT):
if currentTimes > limit:
break
diff = diffs[i]
time = times[i]
prevTime = times[i-1]
if level >= diff:
currentTimes += time
else:
currentTimes += (prevTime+time) * (diff-level) + time
# 범위 재조정
if currentTimes > limit:
minLev = level + 1
else:
maxLev = level - 1
answer = minLev
return answer
풀이 방법
- 문제를 제한 시간안에 다 풀 수 있는 수준을 찾는 문제로 이진 탐색을 바로 떠올려야 한다.
- 범위를 좁혀가면서 정답을 찾는다.
- 현재 레벨이 문제를 다 풀 수 있다면
- 현재 레벨보다 작았을 때도 문제를 풀 수 있는지 확인이 필요하므로 maxLev을 level - 1로 줄여줌으로써 범위를 좁힐 수 있다.
- 현재 레벨로는 문제를 제한 시간 내에 다 풀 수 없다면
- 현재 레벨 자체를 올려야 하므로 minLev을 level + 1로 올려줌으로써 범위를 좁힐 수 있다.
- 현재 레벨이 문제를 다 풀 수 있다면
- 결과적으로 while이 종료되면 minLev과 maxLev은 같아지면서 둘 중 아무거나 반환하면 끝!
느낀점
- 이제는 바로 이진탐색이 떠오르는 수준에 올랐지만 방심하면 안된다.
'알고리즘' 카테고리의 다른 글
Softeer [Level 2] 나무 공격 {언어 : JavaScript} (2) | 2024.11.08 |
---|---|
Softeer [Level 3] [한양대 HCPC 2023] Pipelined {언어 : JavaScript} (1) | 2024.11.01 |
프로그래머스 [Lv. 1] [PCCP 기출문제] 1번 / 동영상 재생기 {언어 : JavaScript} (1) | 2024.09.26 |
프로그래머스 [Lv. 3] 표 병합 {언어 : Python} (0) | 2024.08.06 |
프로그래머스 [Lv. 3] 순위 {언어 : Python} (0) | 2024.07.08 |