Skip to content

Commit da25fed

Browse files
committed
[level 2] Title: [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지, Time: 50.39 ms, Memory: 121 MB -BaekjoonHub
1 parent 095581c commit da25fed

File tree

2 files changed

+204
-0
lines changed

2 files changed

+204
-0
lines changed
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
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> &gt; <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
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
class Solution {
2+
public int solution(int[] diffs, int[] times, long limit) {
3+
long answer = limit;
4+
5+
for(int diff: diffs) answer = Math.max(diff, answer);
6+
7+
long start =1;
8+
long end = answer;
9+
10+
11+
12+
while(start<=end) {
13+
long mid = start + (end - start)/2;
14+
long current = sol(mid, diffs, times);
15+
16+
if(current <= limit) {
17+
answer = mid;
18+
end = mid - 1;
19+
}
20+
else {
21+
start = mid + 1;
22+
}
23+
}
24+
return (int) answer;
25+
}
26+
27+
public long sol(long limit, int[] diffs, int[] times) {
28+
long currentAnswer = 0;
29+
for(int i =0; i<diffs.length; i++) {
30+
if(limit >= diffs[i]) {
31+
currentAnswer += times[i];
32+
}
33+
else {
34+
long wrong = diffs[i] - limit;
35+
currentAnswer += ((times[i] + times[i-1]) * wrong) + times[i];
36+
}
37+
}
38+
return currentAnswer;
39+
}
40+
}

0 commit comments

Comments
 (0)