|
| 1 | +# [level 2] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 - 340212 |
| 2 | + |
| 3 | +[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/340212) |
| 4 | + |
| 5 | +### 성능 요약 |
| 6 | + |
| 7 | +메모리: 121 MB, 시간: 50.39 ms |
| 8 | + |
| 9 | +### 구분 |
| 10 | + |
| 11 | +코딩테스트 연습 > PCCP 기출문제 |
| 12 | + |
| 13 | +### 채점결과 |
| 14 | + |
| 15 | +정확성: 100.0<br/>합계: 100.0 / 100.0 |
| 16 | + |
| 17 | +### 제출 일자 |
| 18 | + |
| 19 | +2025년 10월 17일 22:30:04 |
| 20 | + |
| 21 | +### 문제 설명 |
| 22 | + |
| 23 | +<p>당신은 순서대로 <code>n</code>개의 퍼즐을 제한 시간 내에 풀어야 하는 퍼즐 게임을 하고 있습니다. 각 퍼즐은 난이도와 소요 시간이 정해져 있습니다. 당신의 숙련도에 따라 퍼즐을 풀 때 틀리는 횟수가 바뀌게 됩니다. 현재 퍼즐의 난이도를 <code>diff</code>, 현재 퍼즐의 소요 시간을 <code>time_cur</code>, 이전 퍼즐의 소요 시간을 <code>time_prev</code>, 당신의 숙련도를 <code>level</code>이라 하면, 게임은 다음과 같이 진행됩니다.</p> |
| 24 | + |
| 25 | +<ul> |
| 26 | +<li><code>diff</code> ≤ <code>level</code>이면 퍼즐을 틀리지 않고 <code>time_cur</code>만큼의 시간을 사용하여 해결합니다.</li> |
| 27 | +<li><code>diff</code> > <code>level</code>이면, 퍼즐을 총 <code>diff</code> - <code>level</code>번 틀립니다. 퍼즐을 틀릴 때마다, <code>time_cur</code>만큼의 시간을 사용하며, 추가로 <code>time_prev</code>만큼의 시간을 사용해 이전 퍼즐을 다시 풀고 와야 합니다. <strong>이전 퍼즐을 다시 풀 때는 이전 퍼즐의 난이도에 상관없이 틀리지 않습니다.</strong> <code>diff</code> - <code>level</code>번 틀린 이후에 다시 퍼즐을 풀면 <code>time_cur</code>만큼의 시간을 사용하여 퍼즐을 해결합니다.</li> |
| 28 | +</ul> |
| 29 | + |
| 30 | +<p>예를 들어 <code>diff</code> = 3, <code>time_cur</code> = 2, <code>time_prev</code> = 4인 경우, <code>level</code>에 따라 퍼즐을 푸는데 걸리는 시간은 다음과 같습니다.</p> |
| 31 | + |
| 32 | +<ul> |
| 33 | +<li><code>level</code> = 1이면, 퍼즐을 3 - 1 = 2번 틀립니다. 한 번 틀릴 때마다 2 + 4 = 6의 시간을 사용하고, 다시 퍼즐을 푸는 데 2의 시간을 사용하므로 총 6 × 2 + 2 = 14의 시간을 사용하게 됩니다.</li> |
| 34 | +<li><code>level</code> = 2이면, 퍼즐을 3 - 2 = 1번 틀리므로, 6 + 2 = 8의 시간을 사용하게 됩니다.</li> |
| 35 | +<li><code>level</code> ≥ 3이면 퍼즐을 틀리지 않으며, 2의 시간을 사용하게 됩니다.</li> |
| 36 | +</ul> |
| 37 | + |
| 38 | +<p>퍼즐 게임에는 전체 제한 시간 <code>limit</code>가 정해져 있습니다. 제한 시간 내에 퍼즐을 모두 해결하기 위한 숙련도의 최솟값을 구하려고 합니다. <strong>난이도, 소요 시간은 모두 양의 정수며, 숙련도도 양의 정수여야 합니다.</strong></p> |
| 39 | + |
| 40 | +<p>퍼즐의 난이도를 순서대로 담은 1차원 정수 배열 <code>diffs</code>, 퍼즐의 소요 시간을 순서대로 담은 1차원 정수 배열 <code>times</code>, 전체 제한 시간 <code>limit</code>이 매개변수로 주어집니다. 제한 시간 내에 퍼즐을 모두 해결하기 위한 숙련도의 최솟값을 정수로 return 하도록 solution 함수를 완성해 주세요.</p> |
| 41 | + |
| 42 | +<hr> |
| 43 | + |
| 44 | +<h5>제한사항</h5> |
| 45 | + |
| 46 | +<ul> |
| 47 | +<li>1 ≤ <code>diffs</code>의 길이 = <code>times</code>의 길이 = <code>n</code> ≤ 300,000 |
| 48 | + |
| 49 | +<ul> |
| 50 | +<li><code>diffs[i]</code>는 <code>i</code>번째 퍼즐의 난이도, <code>times[i]</code>는 <code>i</code>번째 퍼즐의 소요 시간입니다.</li> |
| 51 | +<li><code>diffs[0]</code> = 1</li> |
| 52 | +<li>1 ≤ <code>diffs[i]</code> ≤ 100,000</li> |
| 53 | +<li>1 ≤ <code>times[i]</code> ≤ 10,000</li> |
| 54 | +</ul></li> |
| 55 | +<li>1 ≤ <code>limit</code> ≤ 10<sup>15</sup> |
| 56 | + |
| 57 | +<ul> |
| 58 | +<li>제한 시간 내에 퍼즐을 모두 해결할 수 있는 경우만 입력으로 주어집니다.</li> |
| 59 | +</ul></li> |
| 60 | +</ul> |
| 61 | + |
| 62 | +<hr> |
| 63 | + |
| 64 | +<h5>입출력 예</h5> |
| 65 | +<table class="table"> |
| 66 | + <thead><tr> |
| 67 | +<th>diffs</th> |
| 68 | +<th>times</th> |
| 69 | +<th>limit</th> |
| 70 | +<th>result</th> |
| 71 | +</tr> |
| 72 | +</thead> |
| 73 | + <tbody><tr> |
| 74 | +<td>[1, 5, 3]</td> |
| 75 | +<td>[2, 4, 7]</td> |
| 76 | +<td>30</td> |
| 77 | +<td>3</td> |
| 78 | +</tr> |
| 79 | +<tr> |
| 80 | +<td>[1, 4, 4, 2]</td> |
| 81 | +<td>[6, 3, 8, 2]</td> |
| 82 | +<td>59</td> |
| 83 | +<td>2</td> |
| 84 | +</tr> |
| 85 | +<tr> |
| 86 | +<td>[1, 328, 467, 209, 54]</td> |
| 87 | +<td>[2, 7, 1, 4, 3]</td> |
| 88 | +<td>1723</td> |
| 89 | +<td>294</td> |
| 90 | +</tr> |
| 91 | +<tr> |
| 92 | +<td>[1, 99999, 100000, 99995]</td> |
| 93 | +<td>[9999, 9001, 9999, 9001]</td> |
| 94 | +<td>3456789012</td> |
| 95 | +<td>39354</td> |
| 96 | +</tr> |
| 97 | +</tbody> |
| 98 | + </table> |
| 99 | +<hr> |
| 100 | + |
| 101 | +<h5>입출력 예 설명</h5> |
| 102 | + |
| 103 | +<p><strong>입출력 예 #1</strong></p> |
| 104 | + |
| 105 | +<p>숙련도가 3인 경우 다음과 같이 진행됩니다.</p> |
| 106 | + |
| 107 | +<ul> |
| 108 | +<li>1번째 퍼즐을 2의 시간을 사용하여 해결합니다.</li> |
| 109 | +<li>2번째 퍼즐을 5 - 3 = 2번 틀려서 총 (4 + 2) × 2 + 4 = 16의 시간을 사용하여 해결합니다.</li> |
| 110 | +<li>3번째 퍼즐을 7의 시간을 사용하여 해결합니다.</li> |
| 111 | +</ul> |
| 112 | + |
| 113 | +<p>총 2 + 16 + 7 = 25의 시간을 사용하여 모든 퍼즐을 해결할 수 있습니다. 숙련도가 3보다 작은 경우 제한 시간인 30 이내에 모든 퍼즐을 해결할 수 없습니다.</p> |
| 114 | + |
| 115 | +<p>따라서 3을 return 해야 합니다.</p> |
| 116 | + |
| 117 | +<p><strong>입출력 예 #2</strong></p> |
| 118 | + |
| 119 | +<p>숙련도가 2인 경우 다음과 같이 진행됩니다.</p> |
| 120 | + |
| 121 | +<ul> |
| 122 | +<li>1번째 퍼즐을 6의 시간을 사용하여 해결합니다.</li> |
| 123 | +<li>2번째 퍼즐을 4 - 2 = 2번 틀려서 총 (3 + 6) × 2 + 3 = 21의 시간을 사용하여 해결합니다.</li> |
| 124 | +<li>3번째 퍼즐을 4 - 2 = 2번 틀려서 총 (8 + 3) × 2 + 8 = 30의 시간을 사용하여 해결합니다.</li> |
| 125 | +<li>4번째 퍼즐을 2의 시간을 사용하여 해결합니다.</li> |
| 126 | +</ul> |
| 127 | + |
| 128 | +<p>총 6 + 21 + 30 + 2 = 59의 시간을 사용하여 모든 퍼즐을 해결할 수 있습니다. 숙련도가 2보다 작은 경우 제한 시간인 59 이내에 모든 퍼즐을 해결할 수 없습니다.</p> |
| 129 | + |
| 130 | +<p>따라서 2를 return 해야 합니다.</p> |
| 131 | + |
| 132 | +<p><strong>입출력 예 #3</strong></p> |
| 133 | + |
| 134 | +<p>숙련도가 294인 경우 다음과 같이 진행됩니다.</p> |
| 135 | + |
| 136 | +<ul> |
| 137 | +<li>1번째 퍼즐을 2의 시간을 사용하여 해결합니다.</li> |
| 138 | +<li>2번째 퍼즐을 328 - 294 = 34번 틀려서 총 (7 + 2) × 34 + 7 = 313의 시간을 사용하여 해결합니다.</li> |
| 139 | +<li>3번째 퍼즐을 467 - 294 = 173번 틀려서 총 (1 + 7) × 173 + 1 = 1385의 시간을 사용하여 해결합니다.</li> |
| 140 | +<li>4번째 퍼즐을 4의 시간을 사용하여 해결합니다.</li> |
| 141 | +<li>5번째 퍼즐을 3의 시간을 사용하여 해결합니다.</li> |
| 142 | +</ul> |
| 143 | + |
| 144 | +<p>총 2 + 313 + 1385 + 4 + 3 = 1707의 시간을 사용하여 모든 퍼즐을 해결할 수 있습니다. 숙련도가 294보다 작은 경우 제한 시간인 1723 이내에 모든 퍼즐을 해결할 수 없습니다.</p> |
| 145 | + |
| 146 | +<p>따라서 294를 return 해야 합니다.</p> |
| 147 | + |
| 148 | +<p><strong>입출력 예 #4</strong></p> |
| 149 | + |
| 150 | +<p>숙련도가 39354인 경우 다음과 같이 진행됩니다.</p> |
| 151 | + |
| 152 | +<ul> |
| 153 | +<li>1번째 퍼즐을 9999의 시간을 사용하여 해결합니다.</li> |
| 154 | +<li>2번째 퍼즐을 99999 - 39354 = 60645번 틀려서 총 (9001 + 9999) × 60645 + 9001 = 1152264001의 시간을 사용하여 해결합니다.</li> |
| 155 | +<li>3번째 퍼즐을 100000 - 39354 = 60646번 틀려서 총 (9999 + 9001) × 60646 + 9999 = 1152283999의 시간을 사용하여 해결합니다.</li> |
| 156 | +<li>4번째 퍼즐을 99995 - 39354 = 60641번 틀려서 총 (9001 + 9999) × 60641 + 9001 = 1152188001의 시간을 사용하여 해결합니다.</li> |
| 157 | +</ul> |
| 158 | + |
| 159 | +<p>총 9999 + 1152264001 + 1152283999 + 1152188001 = 3456746000의 시간을 사용하여 모든 퍼즐을 해결할 수 있습니다. 숙련도가 39354보다 작은 경우 제한 시간인 3456789012 이내에 모든 퍼즐을 해결할 수 없습니다.</p> |
| 160 | + |
| 161 | +<p>따라서 39354를 return 해야 합니다.</p> |
| 162 | + |
| 163 | + |
| 164 | +> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges |
0 commit comments