Skip to content

Commit 31517da

Browse files
committed
[level 4] Title: 도둑질, Time: 32.79 ms, Memory: 103 MB -BaekjoonHub
1 parent 3469770 commit 31517da

2 files changed

Lines changed: 98 additions & 0 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# [level 4] 도둑질 - 42897
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/42897?language=java)
4+
5+
### 성능 요약
6+
7+
메모리: 103 MB, 시간: 32.79 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 동적계획법(Dynamic Programming)
12+
13+
### 채점결과
14+
15+
정확성: 50.0<br/>효율성: 50.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 04월 21일 11:36:25
20+
21+
### 문제 설명
22+
23+
<p>도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다. </p>
24+
25+
<p><img src="https://grepp-programmers.s3.amazonaws.com/files/ybm/e7dd4f51c3/a228c73d-1cbe-4d59-bb5d-833fd18d3382.png" title="" alt="image.png"></p>
26+
27+
<p>각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한 두 집을 털면 경보가 울립니다.</p>
28+
29+
<p>각 집에 있는 돈이 담긴 배열 money가 주어질 때, 도둑이 훔칠 수 있는 돈의 최댓값을 return 하도록 solution 함수를 작성하세요.</p>
30+
31+
<h5>제한사항</h5>
32+
33+
<ul>
34+
<li>이 마을에 있는 집은 3개 이상 1,000,000개 이하입니다.</li>
35+
<li>money 배열의 각 원소는 0 이상 1,000 이하인 정수입니다.</li>
36+
</ul>
37+
38+
<h5>입출력 예</h5>
39+
<table class="table">
40+
<thead><tr>
41+
<th>money</th>
42+
<th>return</th>
43+
</tr>
44+
</thead>
45+
<tbody><tr>
46+
<td>[1, 2, 3, 1]</td>
47+
<td>4</td>
48+
</tr>
49+
</tbody>
50+
</table>
51+
52+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import static java.lang.Math.max;
2+
3+
4+
class Solution {
5+
public int solution(int[] money) {
6+
7+
int answer;
8+
9+
if (money.length == 3) {return Math.max(Math.max(money[0], money[1]), money[2]);}
10+
11+
12+
int[] dp1 = new int[money.length];
13+
int[] dp2 = new int[money.length];
14+
15+
int case_1;
16+
int case_2;
17+
18+
// 범위 제한 0부터 n-2까지
19+
dp1[0] = money[0];
20+
dp1[1] = max(money[0], money[1]);
21+
22+
// 범위제한 1부터 n-1까지
23+
dp2[0] = money[1];
24+
dp2[1] = max(dp2[0], money[2]);
25+
26+
27+
for (int i = 2; i <= money.length - 2 ; i++)
28+
{
29+
30+
dp1[i] = max(dp1[i - 1], dp1[i - 2] + money[i]);
31+
}
32+
case_1 = dp1[money.length - 2];
33+
34+
// 범위 제한 1부터 n-1까지
35+
for (int i = 2; i <= money.length - 2 ; i++)
36+
{
37+
dp2[i] = max(dp2[i - 1], dp2[i - 2] + money[i+1]);
38+
}
39+
case_2 = dp2[money.length - 2];
40+
41+
answer = max(case_1, case_2);
42+
43+
44+
return answer;
45+
}
46+
}

0 commit comments

Comments
 (0)