🧾 목차
1. 문제 설명
2. 문제 풀이
3. 정답 코드
4. 총평
1. 문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/340212
퍼즐 해결 시 소요 시간 계산 방법
예제 조건
- 퍼즐 난이도 : 1,5,3
- 퍼즐당 기본 시간 : 2,4,7
- 나의 레벨 : 1
계산 과정
1. 첫 번째 퍼즐 (난이도 1, 시간 2)
- 내 레벨(1)과 같으므로, 소요 시간 = 2
2. 두 번째 퍼즐 (난이도 5, 시간 4)
- 난이도 (5) > 내 레벨(1)이므로 추가 시간 발생
- 추가 시간 공식
👉 (이전 퍼즐 소요 시간 + 현재 퍼즐 소요 시간 ) x (퍼즐 난이도 - 내 레벨) + 현재 퍼즐 소요 시간
- 적용
(2 + 4) x (5 - 1) + 4 = 6 x 4 + 4 = 24 + 4 = 28
- 총 소요 시간 = 28
3. 세 번 째 퍼즐 (난이도 3, 시간 7)
- 계산해보시오
주의 할점
- 퍼즐 난이도가 내 레벨보다 크면 추가 시간이 필요함
- 공식을 올바르게 적용하여 누적시간 계산해야 함
2. 문제 풀이
제한사항을 보다시피 굉장히 큰 수이므로, 이분탐색으로 접근한다.
⭐ 시간 복잡도
1) 완전탐색
만약 이분탐색을 사용하지 않고 모든 반복을 수행한다면?
레벨 : 1 <= diffs[i] <= 100,000
퍼즐의 길이 : 1 <= diffs.length <= 300,000
👉 레벨 x 퍼즐의 길이 = 3 x 10^10 (시간초과!!)
2) 이분탐색
그렇다며 이분탐색으로 최소 레벨을 찾는 시간복잡도는?
이분탐색을 적용한 레벨 찾기 : log(n) = log(10^5) ≃ 20
퍼즐의 길이 : 위와 동일
👉 레벨 x 퍼즐의 길이 = 6 x 10^6 (만족)
코드 풀이
1) 초기화
이분탐색으로 나의 레벨을 찾기 위해 [left, right]를 [최소 레벨, 최대 레벨] 로 세팅한다.
2) 이분 탐색
단계 1. 중간 값 찾기
단계 2. 소요 시간을 계산
단계 3. 범위를 조정
if elapsed == limit 👉 mid를 즉시 리턴해도됨!
3. 정답 코드
MAX_MY_LEVEL = 100000;
function solution(diffs, times, limit) {
var [left, right] = [1, 100000]; // 최소 레벨, 최대 레벨
while (left <= right) {
var level = Math.floor((left + right) / 2); // 중간 값 계산
// 소요시간을 계산
var elapsed = 0;
for (let i = 0; i < diffs.length; i++) {
if (diffs[i] > level) {
elapsed += ((times[i] + times[i-1]) * (diffs[i] - level)) + times[i];
} else {
elapsed += times[i];
}
}
// 범위를 조정
if (elapsed > limit) { // 소요시간이 더 많을 경우
left = level + 1;
} else {
right = level -1;
}
}
return left;
}
4. 총평
이 문제는 직접 해결하지 못했다.
그 이유는 문제 파악을 제대로 하지 않아 소요 시간을 계산하는 로직을 틀렸기 때문이다.
이처럼, PCCP 문제는 특히 문제가 길고, 예제가 복잡하다는 것을 알 수 있었다.
문제 파악이 잘 되지 않을 때, 풀이보다는 예제를 통해 이해를 충분히 하고 넘어가야한다는 것을 다시 한번 느꼈다..내 시간.....
'Algorithm' 카테고리의 다른 글
[Javascript] 프로그래머스 - 네트워크 (0) | 2025.02.03 |
---|---|
[Javascript] 프로그래머스 - 징검다리 (1) | 2025.01.30 |
[Javascript] 프로그래머스 - 입국심사 (0) | 2025.01.28 |
[Javascript] 프로그래머스 - 타겟 넘버 (2) | 2025.01.28 |
[Javascript] 프로그래머스 - 베스트 앨범 (0) | 2025.01.25 |