1+ /**
2+ * ์ฒ์ ์ง๊ณผ ๋ ์ง์ ์ฐ๊ฒฐ๋์ด ์์.
3+ * ์ฃผ์ด์ง ๋ฐฐ์ด์์ ์ธ์ ํ ์ง์ ํธ์ง ์๊ณ ํ์น ์ ์๋ ์ต๋ ๊ธ์ก์ ๊ณ์ฐํ๋ ํจ์
4+ *
5+ * @param {number[] } nums - ๊ฐ ์ง์ ์๋ ๋์ ์์ ๋ํ๋ด๋ ๋ฐฐ์ด
6+ * @returns {number } - ๊ฒฝ๋ณด๋ฅผ ์ธ๋ฆฌ์ง ์๊ณ ํ์น ์ ์๋ ์ต๋ ๊ธ์ก
7+ *
8+ * ์๊ฐ ๋ณต์ก๋: O(n)
9+ * - ๋ชจ๋ ์ง์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธ
10+ *
11+ * ๊ณต๊ฐ ๋ณต์ก๋: O(1)
12+ * - ์์ ๊ฐ์ ๋ณ์๋ง ์ฌ์ฉ
13+ */
14+ function rob ( nums : number [ ] ) : number {
15+ const houses = nums . length ;
16+
17+ if ( houses === 1 ) return nums [ 0 ] ;
18+
19+ const robber = ( nums : number [ ] , start : number , end : number ) => {
20+ let prevMax = 0 ; // ๋ฐ๋ก ์ด์ ์ง๊น์ง ํธ์ด์ ์ป์ ์ต๋ ๊ธ์ก
21+ let currMax = 0 ; // ํ์ฌ ์ง๊น์ง ํธ์ด์ ์ป์ ์ต๋ ๊ธ์ก
22+
23+ // start๋ถํฐ end๊น์ง ๋ฐ๋ณตํ๋ฉฐ DP ์งํ
24+ for ( let i = start ; i <= end ; i ++ ) {
25+ // ํ์ฌ ์ง(i)์ ํธ ๊ฒฝ์ฐ์ ํธ์ง ์์ ๊ฒฝ์ฐ์ ์ต๋ ๊ธ์ก ๊ณ์ฐ
26+ const temp = currMax ;
27+ currMax = Math . max ( currMax , prevMax + nums [ i ] ) ;
28+ prevMax = temp ;
29+ }
30+
31+ return currMax ;
32+ }
33+
34+
35+ // ์ํ ๊ตฌ์กฐ์ด๋ฏ๋ก, ์ฒซ ๋ฒ์งธ ์ง์ ํธ ๊ฒฝ์ฐ์ ๋ง์ง๋ง ์ง์ ํธ ๊ฒฝ์ฐ๋ ๋์์ ๋ถ๊ฐ๋ฅ
36+ // ๋ ๊ตฌ๊ฐ์ ๋ฐ๋ก ๊ณ์ฐํ๊ณ ์ต๋๊ฐ์ ๋ฐํ
37+ const max1 = robber ( nums , 0 , houses - 2 ) ; // ์ฒซ ๋ฒ์งธ ์ง๋ถํฐ ๋ง์ง๋ง์์ ๋ ๋ฒ์งธ ์ง๊น์ง ๊ณ ๋ ค
38+ const max2 = robber ( nums , 1 , houses - 1 ) ; // ๋ ๋ฒ์งธ ์ง๋ถํฐ ๋ง์ง๋ง ์ง๊น์ง ๊ณ ๋ ค
39+
40+ return Math . max ( max1 , max2 ) ;
41+
42+ } ;
0 commit comments