Skip to content

Commit c99013c

Browse files
committed
[Gold V] Title: 퇴사 2, Time: 672 ms, Memory: 310352 KB -BaekjoonHub
1 parent 96c5473 commit c99013c

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# [Gold V] 퇴사 2 - 15486
2+
3+
[문제 링크](https://www.acmicpc.net/problem/15486)
4+
5+
### 성능 요약
6+
7+
메모리: 310352 KB, 시간: 672 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2025년 3월 16일 16:47:37
16+
17+
### 문제 설명
18+
19+
<p>상담원으로 일하고 있는 백준이는 퇴사를 하려고 한다.</p>
20+
21+
<p>오늘부터 N+1일째 되는 날 퇴사를 하기 위해서, 남은 N일 동안 최대한 많은 상담을 하려고 한다.</p>
22+
23+
<p>백준이는 비서에게 최대한 많은 상담을 잡으라고 부탁을 했고, 비서는 하루에 하나씩 서로 다른 사람의 상담을 잡아놓았다.</p>
24+
25+
<p>각각의 상담은 상담을 완료하는데 걸리는 기간 T<sub>i</sub>와 상담을 했을 때 받을 수 있는 금액 P<sub>i</sub>로 이루어져 있다.</p>
26+
27+
<p>N = 7인 경우에 다음과 같은 상담 일정표를 보자.</p>
28+
29+
<table class="table table-bordered">
30+
<thead>
31+
<tr>
32+
<th> </th>
33+
<th>1일</th>
34+
<th>2일</th>
35+
<th>3일</th>
36+
<th>4일</th>
37+
<th>5일</th>
38+
<th>6일</th>
39+
<th>7일</th>
40+
</tr>
41+
</thead>
42+
<tbody>
43+
<tr>
44+
<th>T<sub>i</sub></th>
45+
<td>3</td>
46+
<td>5</td>
47+
<td>1</td>
48+
<td>1</td>
49+
<td>2</td>
50+
<td>4</td>
51+
<td>2</td>
52+
</tr>
53+
<tr>
54+
<th>P<sub>i</sub></th>
55+
<td>10</td>
56+
<td>20</td>
57+
<td>10</td>
58+
<td>20</td>
59+
<td>15</td>
60+
<td>40</td>
61+
<td>200</td>
62+
</tr>
63+
</tbody>
64+
</table>
65+
66+
<p>1일에 잡혀있는 상담은 총 3일이 걸리며, 상담했을 때 받을 수 있는 금액은 10이다. 5일에 잡혀있는 상담은 총 2일이 걸리며, 받을 수 있는 금액은 15이다.</p>
67+
68+
<p>상담을 하는데 필요한 기간은 1일보다 클 수 있기 때문에, 모든 상담을 할 수는 없다. 예를 들어서 1일에 상담을 하게 되면, 2일, 3일에 있는 상담은 할 수 없게 된다. 2일에 있는 상담을 하게 되면, 3, 4, 5, 6일에 잡혀있는 상담은 할 수 없다.</p>
69+
70+
<p>또한, N+1일째에는 회사에 없기 때문에, 6, 7일에 있는 상담을 할 수 없다.</p>
71+
72+
<p>퇴사 전에 할 수 있는 상담의 최대 이익은 1일, 4일, 5일에 있는 상담을 하는 것이며, 이때의 이익은 10+20+15=45이다.</p>
73+
74+
<p>상담을 적절히 했을 때, 백준이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.</p>
75+
76+
### 입력
77+
78+
<p>첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다.</p>
79+
80+
<p>둘째 줄부터 N개의 줄에 T<sub>i</sub>와 P<sub>i</sub>가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ T<sub>i</sub> ≤ 50, 1 ≤ P<sub>i</sub> ≤ 1,000)</p>
81+
82+
### 출력
83+
84+
<p>첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.</p>
85+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static void main(String[] args) throws IOException {
6+
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
9+
int N = Integer.parseInt(br.readLine());
10+
11+
StringTokenizer st;
12+
13+
int T[] = new int[N+2];
14+
int P[] = new int[N+2];
15+
16+
for(int i =1; i<=N; i++) {
17+
st = new StringTokenizer(br.readLine());
18+
19+
T[i] = Integer.parseInt(st.nextToken());
20+
P[i] = Integer.parseInt(st.nextToken());
21+
}
22+
int dp[] = new int[N+2];
23+
24+
if(T[N] ==1) {
25+
dp[N] = P[N];
26+
}
27+
for(int i= N;i >=1; i--) {
28+
if(T[i] + i >N+1) {
29+
dp[i] = dp[i+1];
30+
continue;
31+
}
32+
dp[i] = Math.max(dp[i+1], dp[i+T[i]]+P[i]);
33+
}
34+
35+
int answer = Integer.MIN_VALUE;
36+
for(int i= 1;i <=N; i++) {
37+
answer = Math.max(answer, dp[i]);
38+
}
39+
40+
System.out.println(answer);
41+
42+
43+
}
44+
45+
46+
}

0 commit comments

Comments
 (0)