728x90
🔗 문제 링크
💡 문제 풀이 및 해석
- 숙련도를 구해야 하는데, 난이도와 시간의 배열이 상당히 크다.
- 숙련도가 어느 정도일지 예상이 안가고, 예제를 보니
1,2,3, ...
이런식으로 가면 최악의 시간 만족도를 충족시킬 수 없다. - 여기서는 하나씩 체크하는 방식이 아닌 범위를 잡고 좁혀들어가는
이분 탐색
방식이 어울리는 것을 알 수 있다. - 숙련도와 level에 대해서는 문제에서 설명한 방식 그대로 구현한 것이여서 생략하겠습니다.
⭐️ 정답 코드 및 설명
#include <string>
#include <vector>
using namespace std;
bool puzzle(vector<int> diffs, vector<int> times, long long limit, int level) {
long answer = 0;
if (diffs[0] > level) answer += (diffs[0] - level + 1) * times[0];
else answer += times[0];
for (int i = 1; i < diffs.size(); i++) {
int diff = diffs[i], time = times[i], time_prev = times[i - 1];
if (diff > level) answer += (diff - level) * (time_prev + time) + time;
else answer += time;
}
return answer > limit;
}
int solution(vector<int> diffs, vector<int> times, long long limit) {
int answer = 0;
int left = 0, right = 9876543210;
while (left + 1 < right) {
int mid = (left + right) / 2;
if (puzzle(diffs, times, limit, mid)) left = mid;
else right = mid;
}
return right;
}
🤔 문제 후기
문제는 되게 쉽게 풀었는데, if (diff > level) answer += (diff - level) * (time_prev + time) + time;
이 부분에서 i == 0
을 예외처리하고 조건을 복붙해서 (time_prev + time)
을 넣어주지 않아서 이거 찾는데 30분이 걸렸다. 막히는게 있다면 가끔 쉬운 부분에서 막히는게 아닐까 다시한 번 생각해보면 좋을 것 같은 문제였다.
728x90
'알고리즘 문제 풀이' 카테고리의 다른 글
[ 백준 21610 ] 마법사 상어와 비바라기 (C++) - 시뮬레이션 (3) | 2024.10.13 |
---|---|
[ 백준 20056 ] 마법사 상어와 파이어볼 (C++) - 시뮬레이션 (3) | 2024.10.12 |
[ 백준 1277 ] 발전소 설치 (C++) - 그래프 이론, 구현 (0) | 2024.09.23 |
[ 백준 17142 ] 연구소 3 (C++) - BFS, 시뮬레이션 (0) | 2024.09.12 |
[ 백준 16236 ] 아기 상어 (C++) - BFS (1) | 2024.09.11 |