๐จ ์ด๋ณด์ ์นํ ๊ฐ์ด๋ 'Number of Ways to Paint N 3 Grid' โ LeetCode 1411 (C++, Python, JavaScript)
Source: Dev.to

Problem Summary
์ฃผ์ด์ง ์กฐ๊ฑด:
- n ํ, 3 ์ด์ธ ๊ฒฉ์.
- ์ฌ์ฉํ ์ ์๋ ์์ ๋นจ๊ฐ, ๋ ธ๋, ์ด๋ก ์ด 3๊ฐ์ง.
- ์ธ์ ํ ๋ ์ (๊ฐ๋ก ๋๋ ์ธ๋ก)์ ๊ฐ์ ์์ ๊ฐ์ง ์ ์๋ค๋ ๊ท์น.

๋ชฉํ
- ์ ์ฒด ๊ฒฉ์๋ฅผ ์์น ํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ค.
- ๊ฒฐ๊ณผ๋ (10^9+7) ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๋ฐํํ๋ค.
Intuition
๊ฐ ํ์ ์ ์ 3๊ฐ๋ฟ์ด๋ฏ๋ก, ๋ชจ๋ ์ ํจํ ํ์ ๋ ๊ฐ์ง ํจํด ์ค ํ๋์ ์ํ๋ค:
| ํจํด | ์ค๋ช | ๊ฐ๋ฅํ ์กฐํฉ ์ |
|---|---|---|
| ABA | ์ฒซ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ์ ์ ๊ฐ์ ์, ๊ฐ์ด๋ฐ ์ ์ ๋ค๋ฅธ ์ (์: ๋นจ๊ฐโ๋ ธ๋โ๋นจ๊ฐ) | 6 |
| ABC | ์ธ ์ ๋ชจ๋ ์๋ก ๋ค๋ฅธ ์ (์: ๋นจ๊ฐโ๋ ธ๋โ์ด๋ก) | 6 |
ํ i ์๋์ ํ iโฏ+โฏ1 ์ ๋์ ๋, ๊ธฐ์กด ํ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ์ ํ์ ๋ฐฐ์นํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ธ๋ฉด:
- ABA ํ ์๋: ๊ฐ๋ฅํ ABA ํ 3๊ฐ์ง, ๊ฐ๋ฅํ ABC ํ 2๊ฐ์ง.
- ABC ํ ์๋: ๊ฐ๋ฅํ ABA ํ 2๊ฐ์ง, ๊ฐ๋ฅํ ABC ํ 2๊ฐ์ง.
ABA์ ABC ํ์ ๊ฐ์๋ง ์ ์งํ๊ณ ๊ฐ ์ถ๊ฐ ํ๋ง๋ค ์ ๋ฐ์ดํธํ๋ฉด ์ ํ ์๊ฐ ํด๊ฒฐ์ฑ ์ ์ป์ ์ ์๋ค.
Code Blocks
C++
class Solution {
public:
int numOfWays(int n) {
constexpr int kMod = 1000000007;
long color2 = 6; // ABA patterns
long color3 = 6; // ABC patterns
for (int i = 1; i < n; ++i) {
long next_color2 = (color2 * 3 + color3 * 2) % kMod;
long next_color3 = (color2 * 2 + color3 * 2) % kMod;
color2 = next_color2;
color3 = next_color3;
}
return (color2 + color3) % kMod;
}
};
Python
k_mod = 10**9 + 7
# color2 = ABA patterns, color3 = ABC patterns
color2 = 6
color3 = 6
for _ in range(1, n):
next_color2 = (color2 * 3 + color3 * 2) % k_mod
next_color3 = (color2 * 2 + color3 * 2) % k_mod
color2, color3 = next_color2, next_color3
result = (color2 + color3) % k_mod
JavaScript
/**
* @param {number} n
* @return {number}
*/
var numOfWays = function(n) {
const kMod = 1000000007n; // BigInt for safety
let color2 = 6n; // ABA
let color3 = 6n; // ABC
for (let i = 1; i < n; i++) {
const nextColor2 = (color2 * 3n + color3 * 2n) % kMod;
const nextColor3 = (color2 * 2n + color3 * 2n) % kMod;
color2 = nextColor2;
color3 = nextColor3;
}
return Number((color2 + color3) % kMod);
};
Key Takeaways
- State Reduction: ํ ๊ตฌ์ฑ์ ABA์ ABC ํจํด์ผ๋ก ๋ฌถ์์ผ๋ก์จ ๊ฐ๋ณ ์ ์กฐํฉ์ ๋ชจ๋ ์ถ์ ํ ํ์๊ฐ ์๋ค.
- Linear Time Complexity: ์๊ณ ๋ฆฌ์ฆ์ O(n) ์๊ฐ์ ๋์ํ๋ฉฐ ํ์ ํ ๋ฒ๋ง ์ํํ๋ค.
- Modulo Arithmetic: ๊ฐ ๋จ๊ณ๋ง๋ค ๋ชจ๋๋ฌ ์ฐ์ฐ์ ์ ์ฉํด ์นด์ดํธ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
Final Thoughts
์ด ๋ฌธ์ ๋ ์ํ ์ ์ด ๋์ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์ฐ๊ธฐ์ ํ๋ฅญํ ์ ๋ฌธ ์ฌ๋ก์ด๋ค. ์ธ์ ํ ๊ฐ์ฒด๊ฐ ์๋ก ๋ฌ๋ผ์ผ ํ๋ ์์ ์ค์ผ์ค๋ง์ด๋ ์ง๋ ์์น ์๊ณ ๋ฆฌ์ฆ ๋ฑ ์ค์ ์ํฉ์์๋ ๋น์ทํ ํจํด ์นด์ดํ ๊ธฐ๋ฒ์ด ๋ฑ์ฅํ๋ค. ์ด๋ฌํ ์นด์ดํ ๋ฌธ์ ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ์ต๊ณ ์์ค ๊ธฐ์ ์ ๊ธฐ์ ๋ฉด์ ์ ์ฑ๊ณต์ ์ผ๋ก ํต๊ณผํ๋ ๋ฐ ํฐ ๋์์ด ๋๋ค.