790 - Domino and Tromino Tiling
정보
- 문제 보기: 790 - Domino and Tromino Tiling
- 소요 시간: 💥1시간 4분
- 풀이 언어:
java
- 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
DP
수학
풀이 코드
정보
- 메모리: 41100 KB
- 시간: 1 ms
class Solution {
int n;
final long mod = 1_000_000_007;
int memo[][] = new int[2][1000];
public int dp(int i, boolean gap) {
if (i == n) return gap ? 0 : 1;
if (i > n) return 0;
if (memo[gap?1:0][i] != -1) return memo[gap?1:0][i];
long res = 0L;
if (gap) {
res += dp(i+1, false); // ㄱ
res += dp(i+1, true); // ㅡ
}
else {
res += dp(i+1, false); // ㅣ
res += dp(i+2, false); // =
res += 2L * dp(i+2, true); // ㄴ
}
res %= mod;
return memo[gap?1:0][i] = (int)res;
}
public int numTilings(int n) {
this.n = n;
Arrays.fill(memo[0], -1);
Arrays.fill(memo[1], -1);
return dp(0, false);
}
}
풀이 해설
문제 보자마자 어? 2×n 타일링 문제 아님? 했는데
비슷하긴 개뿔 ㄴ모양 ㄱ모양 타일이 추가된 업그레이드 버전이었음.
문제에선 도미노라고 하는데 그냥 타일이라고 하겠다.
📌 2×n 타일 문제의 특징
타일링은 주로 빡구현이거나 DP에 해당한다. 이전에 DP로 푼 적 있어서 유형은 바로 알아챘다.
한가지 더 잡고 갈 포인트는 '2×n'이다. board가 2차원 배열이니 2중 for문 돌면서 빈 칸 찾으면 다음 dp 진행하는 방식을 떠올릴 수 있겠지만
사실은 그냥 테트리스 오른쪽으로 엎어놓은 것 마냥 딱 맞게 채워나가는 식의 단방향 dp이다.