![[프로그래머스/JAVA] 340212번 퍼즐 게임 챌린지](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHZbXg%2FbtsKqD1stZB%2FMKot7uXV1mPFu02JwoKpJ0%2Fimg.png)

[프로그래머스/JAVA] 340212번 퍼즐 게임 챌린지Coding Test/Programmers2024. 10. 31. 19:30
목차
문제
더보기
문제 링크
[PCCP 기출문제] 2번 / 퍼즐 게임 챌린지
https://school.programmers.co.kr/learn/courses/30/lessons/340212
문제 설명
당신은 순서대로 n개의 퍼즐을 제한 시간 내에 풀어야 하는 퍼즐 게임을 하고 있습니다.
각 퍼즐은 난이도와 소요 시간이 정해져 있습니다. 당신의 숙련도에 따라 퍼즐을 풀 때 틀리는 횟수가 바뀌게 됩니다.
현재 퍼즐의 난이도를 diff, 현재 퍼즐의 소요 시간을 time_cur, 이전 퍼즐의 소요 시간을 time_prev, 당신의 숙련도를 level이라 하면, 게임은 다음과 같이 진행됩니다.
- diff ≤ level이면 퍼즐을 틀리지 않고 time_cur만큼의 시간을 사용하여 해결합니다.
- diff > level이면, 퍼즐을 총 diff - level번 틀립니다. 퍼즐을 틀릴 때마다, time_cur만큼의 시간을 사용하며, 추가로 time_prev만큼의 시간을 사용해 이전 퍼즐을 다시 풀고 와야 합니다.
- 이전 퍼즐을 다시 풀 때는 이전 퍼즐의 난이도에 상관없이 틀리지 않습니다. diff - level번 틀린 이후에 다시 퍼즐을 풀면 time_cur만큼의 시간을 사용하여 퍼즐을 해결합니다.
퍼즐 게임에는 전체 제한 시간 limit가 정해져 있습니다. 제한 시간 내에 퍼즐을 모두 해결하기 위한 숙련도의 최솟값을 구하려고 합니다.
난이도, 소요 시간은 모두 양의 정수며, 숙련도도 양의 정수여야 합니다.
퍼즐의 난이도를 순서대로 담은 1차원 정수 배열 diffs, 퍼즐의 소요 시간을 순서대로 담은 1차원 정수 배열 times, 전체 제한 시간 limit이 매개변수로 주어집니다.
제한 시간 내에 퍼즐을 모두 해결하기 위한 숙련도의 최솟값을 정수로 return 하도록 solution 함수를 완성해 주세요.
제한 사항
- 1 ≤ diffs의 길이 = times의 길이 = n ≤ 300,000
- diffs[i]는 i번째 퍼즐의 난이도, times[i]는 i번째 퍼즐의 소요 시간입니다.
- diffs[0] = 1
- 1 ≤ diffs[i] ≤ 100,000
- 1 ≤ times[i] ≤ 10,000
- 1 ≤ limit ≤ 1015
- 제한 시간 내에 퍼즐을 모두 해결할 수 있는 경우만 입력으로 주어집니다.
문제 풀이
접근 방법
- Level 과 퍼즐 난이도 diff 에 따른 퍼즐 해결 시간 계산 -> level이 높을 때와 낮을 때를 구분해서 계산
- 소요시간 < limit 인 최소 Level 구하기 -> 이진 탐색으로 1~최대 퍼즐 난이도 범위로 조건에 만족하는 최소 level 구하기
코드
import static util.Util.*;
public class P_340212 {
private static int solution(int[] diffs, int[] times, long limit) {
// diffs 퍼즐 난이도, times 소요 시간, 조건 만족하는 level 의 최솟값 구하기
// 레벨 탐색 범위
int left = 1;
int right = 100000;
// 조건 만족 최소 레벨 저장
int minLevel = -1;
// 탐색 레벨
int mid;
// 탐색 레벨이 해결 소요 시간
long solvedTime;
// 이진 탐색 시작
while(left<=right) {
// 탐색 범위 중간 찾기
mid = left + (right-left)/2;
// 탐색 레벨 소요 시간 찾기
solvedTime = getTime(diffs, times, mid);
// limit 보다 작으면 left ~ (mid-1) 범위 탐색
if(solvedTime<=limit) {
minLevel = mid;
right = mid-1;
} else {
// limit 보다 크면 (mid+1) ~ right 범위 탐색
left = mid+1;
}
}
return minLevel;
}
// 특정 레벨이 퍼즐을 해결하는 시간 계산
private static long getTime(int[] diffs, int[] times, int level) {
long totalTime= 0;
for(int i=0; i< diffs.length; i++) {
if (diffs[i] <= level) {
totalTime += times[i];
} else {
// 틀린 횟수 * (현재 퍼즐 소요시간 + 이전 퍼즐 소요시간) + 현재 퍼즐 완성 시간
totalTime += (long) (diffs[i] - level) * (times[i] + ((i==0) ? 0 : times[i-1])) + times[i];
}
}
return totalTime;
}
}
반응형
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스/JAVA] 340211번 충돌위험 찾기 (3) | 2024.11.04 |
---|---|
[프로그래머스/JAVA] 250135번 아날로그 시계 (1) | 2024.11.02 |
[프로그래머스/JAVA] 250121번 데이터 분석 (1) | 2024.10.31 |
[프로그래머스/JAVA] 250125번 이웃한 칸 (1) | 2024.10.30 |
[프로그래머스/JAVA] 92334번 신고 결과 받기 (3) | 2024.10.30 |

@dundun213 :: dundun213 님의 블로그
dundun213 님의 블로그 입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!