Skip to content

Commit 07f9a75

Browse files
committed
1411. Number of Ways to Paint N × 3 Grid
1 parent f685179 commit 07f9a75

1 file changed

Lines changed: 85 additions & 0 deletions

File tree

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/* 2차 풀이
2+
3+
1. 아이디어 : DP로 풀이 3가지 색깔을 겹치치않게 사용할 경우 패턴은 ABA와 ABC 존재
4+
각 ABA -> ABC, ABA -> ABA, ABC -> ABC, ABC -> ABA 경우의 수를 각각 구해 dp로 계산
5+
이때 2차원 DP를 따로 선언하지 않음(직전 상태값만 필요하므로) - 3ms
6+
7+
2. 시간복잡도 : O(N)
8+
9+
3. 자료구조/알고리즘 : DP
10+
11+
*/
12+
13+
class Solution {
14+
public int numOfWays(int n) {
15+
// 인접한 칸이 같은 색이면 안됨
16+
// 10^9 + 7의 나머지
17+
18+
int MOD = 1_000_000_000 + 7;
19+
20+
// ABA = 6
21+
// ABC = 6
22+
23+
// ABA -> BAB, CAC, BCB (3)
24+
// ABA -> BAC, CAB (2)
25+
// ABC -> BCA, CAB (2)
26+
// ABC -> BAB, BCB (2)
27+
28+
long aba = 6;;
29+
long abc = 6;
30+
31+
for(int i=1; i<n; i++) {
32+
long nextABA = (aba*3 + abc*2)%MOD;
33+
long nextABC = (abc*2 + aba*2)%MOD;
34+
35+
aba = nextABA;
36+
abc = nextABC;
37+
}
38+
39+
40+
return (int)(aba+abc)%MOD;
41+
}
42+
}
43+
44+
/* 1차 풀이
45+
46+
1. 아이디어 : DP로 풀이 3가지 색깔을 겹치치않게 사용할 경우 패턴은 ABA와 ABC 존재
47+
각 ABA -> ABC, ABA -> ABA, ABC -> ABC, ABC -> ABA 경우의 수를 각각 구해 dp로 계산
48+
6ms 소요
49+
50+
2. 시간복잡도 : O(N)
51+
52+
3. 자료구조/알고리즘 : DP
53+
54+
*/
55+
56+
class Solution {
57+
public int numOfWays(int n) {
58+
// 인접한 칸이 같은 색이면 안됨
59+
// 10^9 + 7의 나머지
60+
61+
int MOD = 1_000_000_000 + 7;
62+
63+
// ABA = 6
64+
// ABC = 6
65+
66+
// ABA -> BAB, CAC, BCB (3)
67+
// ABA -> BAC, CAB (2)
68+
// ABC -> BCA, CAB (2)
69+
// ABC -> BAB, BCB (2)
70+
71+
long[][] dp = new long[2][n];
72+
// ABA
73+
dp[0][0] = 6;
74+
// ABC
75+
dp[1][0] = 6;
76+
77+
for(int i=1; i<n; i++) {
78+
dp[0][i] = (dp[0][i-1]*3 + dp[1][i-1]*2)%MOD;
79+
dp[1][i] = (dp[1][i-1]*2 + dp[0][i-1]*2)%MOD;
80+
}
81+
82+
83+
return (int)(dp[0][n-1] + dp[1][n-1])%MOD;
84+
}
85+
}

0 commit comments

Comments
 (0)