File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments