Skip to content

Commit 11db816

Browse files
committed
[level 2] Title: 완전범죄, Time: 0.56 ms, Memory: 86.4 MB -BaekjoonHub
1 parent ba2bd1e commit 11db816

2 files changed

Lines changed: 196 additions & 0 deletions

File tree

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
# [level 2] 완전범죄 - 389480
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/389480#qna)
4+
5+
### 성능 요약
6+
7+
메모리: 86.4 MB, 시간: 0.56 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2025 프로그래머스 코드챌린지 2차 예선
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 03월 04일 20:35:07
20+
21+
### 문제 설명
22+
23+
<p>A도둑과 B도둑이 팀을 이루어 모든 물건을 훔치려고 합니다. 단, 각 도둑이 물건을 훔칠 때 남기는 흔적이 누적되면 경찰에 붙잡히기 때문에, 두 도둑 중 누구도 경찰에 붙잡히지 않도록 흔적을 최소화해야 합니다.</p>
24+
25+
<p>물건을 훔칠 때 조건은 아래와 같습니다.</p>
26+
27+
<ul>
28+
<li>물건 i를 훔칠 때,
29+
30+
<ul>
31+
<li>A도둑이 훔치면 <code>info[i][0]</code>개의 A에 대한 흔적을 남깁니다.</li>
32+
<li>B도둑이 훔치면 <code>info[i][1]</code>개의 B에 대한 흔적을 남깁니다.</li>
33+
</ul></li>
34+
<li>각 물건에 대해 A도둑과 B도둑이 남기는 흔적의 개수는 1 이상 3 이하입니다.</li>
35+
</ul>
36+
37+
<p>경찰에 붙잡히는 조건은 아래와 같습니다.</p>
38+
39+
<ul>
40+
<li>A도둑은 자신이 남긴 흔적의 누적 개수가 <code>n</code>개 이상이면 경찰에 붙잡힙니다.</li>
41+
<li>B도둑은 자신이 남긴 흔적의 누적 개수가 <code>m</code>개 이상이면 경찰에 붙잡힙니다.</li>
42+
</ul>
43+
44+
<p>각 물건을 훔칠 때 생기는 흔적에 대한 정보를 담은 2차원 정수 배열 <code>info</code>, A도둑이 경찰에 붙잡히는 최소 흔적 개수를 나타내는 정수 <code>n</code>, B도둑이 경찰에 붙잡히는 최소 흔적 개수를 나타내는 정수 <code>m</code>이 매개변수로 주어집니다. 두 도둑 모두 경찰에 붙잡히지 않도록 모든 물건을 훔쳤을 때, <strong>A도둑이 남긴 흔적의 누적 개수의 최솟값</strong>을 return 하도록 solution 함수를 완성해 주세요. 만약 어떠한 방법으로도 두 도둑 모두 경찰에 붙잡히지 않게 할 수 없다면 -1을 return해 주세요.</p>
45+
46+
<hr>
47+
48+
<h5>제한사항</h5>
49+
50+
<ul>
51+
<li>1 ≤ <code>info</code>의 길이 ≤ 40
52+
53+
<ul>
54+
<li><code>info[i]</code>는 물건 <code>i</code>를 훔칠 때 생기는 흔적의 개수를 나타내며, [<code>A에 대한 흔적 개수</code>, <code>B에 대한 흔적 개수</code>]의 형태입니다.</li>
55+
<li>1 ≤ <code>흔적 개수</code> ≤ 3</li>
56+
</ul></li>
57+
<li>1 ≤ <code>n</code> ≤ 120</li>
58+
<li>1 ≤ <code>m</code> ≤ 120</li>
59+
</ul>
60+
61+
<hr>
62+
63+
<h5>테스트 케이스 구성 안내</h5>
64+
65+
<p>아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.</p>
66+
<table class="table">
67+
<thead><tr>
68+
<th>그룹</th>
69+
<th>총점</th>
70+
<th>테스트 케이스 그룹 설명</th>
71+
</tr>
72+
</thead>
73+
<tbody><tr>
74+
<td>#1</td>
75+
<td>15%</td>
76+
<td><code>info[i][1]</code> = 1</td>
77+
</tr>
78+
<tr>
79+
<td>#2</td>
80+
<td>40%</td>
81+
<td><code>info</code>의 길이 ≤ 20</td>
82+
</tr>
83+
<tr>
84+
<td>#3</td>
85+
<td>45%</td>
86+
<td>추가 제한 사항 없음</td>
87+
</tr>
88+
</tbody>
89+
</table>
90+
<hr>
91+
92+
<h5>입출력 예</h5>
93+
<table class="table">
94+
<thead><tr>
95+
<th>info</th>
96+
<th>n</th>
97+
<th>m</th>
98+
<th>result</th>
99+
</tr>
100+
</thead>
101+
<tbody><tr>
102+
<td>[[1, 2], [2, 3], [2, 1]]</td>
103+
<td>4</td>
104+
<td>4</td>
105+
<td>2</td>
106+
</tr>
107+
<tr>
108+
<td>[[1, 2], [2, 3], [2, 1]]</td>
109+
<td>1</td>
110+
<td>7</td>
111+
<td>0</td>
112+
</tr>
113+
<tr>
114+
<td>[[3, 3], [3, 3]]</td>
115+
<td>7</td>
116+
<td>1</td>
117+
<td>6</td>
118+
</tr>
119+
<tr>
120+
<td>[[3, 3], [3, 3]]</td>
121+
<td>6</td>
122+
<td>1</td>
123+
<td>-1</td>
124+
</tr>
125+
</tbody>
126+
</table>
127+
<hr>
128+
129+
<h5>입출력 예 설명</h5>
130+
131+
<p><strong>입출력 예 #1</strong></p>
132+
133+
<p>첫 번째와 세 번째 물건을 B도둑이 훔치고 두 번째 물건을 A도둑이 훔치면, A도둑에 대한 흔적은 총 2개이고 B도둑에 대한 흔적은 총 3개입니다. 목표를 달성하면서 A도둑에 대한 흔적 개수를 2보다 더 낮게 만들 수 없습니다.<br>
134+
따라서 2를 return 해야 합니다.</p>
135+
136+
<p><strong>입출력 예 #2</strong></p>
137+
138+
<p>B도둑이 모든 물건을 훔쳐도 B의 흔적이 7개 이상 쌓이지 않습니다.<br>
139+
따라서 A도둑의 흔적은 최소 0이 되며, 0을 return 해야 합니다.</p>
140+
141+
<p><strong>입출력 예 #3</strong></p>
142+
143+
<p>B도둑이 한 번이라도 물건을 훔치면 B의 흔적이 최소 1개 이상 남습니다. 따라서 모든 물건을 A도둑이 훔쳐야 하며, 이 경우에도 A의 흔적은 7개 미만입니다.<br>
144+
따라서, A도둑이 모든 물건을 훔칠 때의 흔적 개수 6을 return 해야 합니다.</p>
145+
146+
<p><strong>입출력 예 #4</strong></p>
147+
148+
<p>어떤 방법으로도 두 도둑 모두 경찰에 붙잡히지 않고 모든 물건을 훔칠 수 없습니다.<br>
149+
따라서 -1을 return 해야 합니다.</p>
150+
151+
152+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
int INF = 50000;
5+
public int solution(int[][] info, int n, int m) {
6+
int answer = dp(info, n, m);
7+
8+
if(answer == INF) return -1;
9+
return answer;
10+
}
11+
12+
int dp(int[][] info, int n, int m){
13+
int size = info.length;
14+
int[][] memo = new int[size + 1][m];
15+
for(int i = 1; i < size + 1; i++) Arrays.fill(memo[i], INF);
16+
17+
int a, b;
18+
for(int i = 1; i < size + 1; i++){
19+
a = info[i - 1][0];
20+
b = info[i - 1][1];
21+
22+
// System.out.println("지금: " + i);
23+
for(int j = 0; j < m; j++){
24+
memo[i][j] = Math.min(memo[i][j], memo[i - 1][j] + a);
25+
if(j + b < m) {
26+
memo[i][j + b] = Math.min(memo[i - 1][j], memo[i][j + b]);
27+
// System.out.println(memo[i][j + b]);
28+
}
29+
// System.out.println(memo[i][j]);
30+
}
31+
}
32+
// for(int i = 0; i < size + 1; i++) System.out.println(Arrays.toString(memo[i]));
33+
34+
35+
36+
37+
int ans = INF;
38+
for(int i = 0; i < m; i++) {
39+
if(memo[size][i] < n) ans = Math.min(ans, memo[size][i]);
40+
}
41+
// System.out.println(":: " + ans);
42+
return ans;
43+
}
44+
}

0 commit comments

Comments
 (0)