Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        250x250
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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
                            
                        
                          
                          - 티스토리챌린지
- 프로그래머스
- join
- DP
- SQL
- javascript
- bfs
- 자바스크립트
- Dynamic Programming
- LEVEL 2
- level 3
- 깊이 우선 탐색
- softeer
- Java
- programmers
- 오블완
- Lv. 3
- 너비 우선 탐색
- group by
- Lv. 0
- Python
- Lv. 2
- 백준
- 소프티어
- Baekjoon
- dfs
- 동적계획법
- 파이썬
- Lv. 1
- SQL 고득점 KIT
                            Archives
                            
                        
                          
                          - Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 {언어 : Python} 본문
728x90
    
    
  문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/340212?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
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은 같아지면서 둘 중 아무거나 반환하면 끝!
느낀점
- 이제는 바로 이진탐색이 떠오르는 수준에 올랐지만 방심하면 안된다.
728x90
    
    
  '알고리즘' 카테고리의 다른 글
| Softeer [Level 2] 나무 공격 {언어 : JavaScript} (2) | 2024.11.08 | 
|---|---|
| Softeer [Level 3] [한양대 HCPC 2023] Pipelined {언어 : JavaScript} (1) | 2024.11.01 | 
| 프로그래머스 [Lv. 1] [PCCP 기출문제] 1번 / 동영상 재생기 {언어 : JavaScript} (2) | 2024.09.26 | 
| 프로그래머스 [Lv. 3] 표 병합 {언어 : Python} (0) | 2024.08.06 | 
| 프로그래머스 [Lv. 3] 순위 {언어 : Python} (0) | 2024.07.08 |