본문 바로가기
코딩 테스트/백준

2133 타일 채우기

by 위그든씨 2025. 1. 3.

3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.

입력

첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다.

출력

첫째 줄에 경우의 수를 출력한다.

=====

문제 분석

1*2, 2*1 타일들을 조합하여 세로의 길이가 3이고 가로의 길이가 n인 직사각형을 채우는 경우의 수를 출력하는 문제이다.

만약 이 문제가 세로의 길이가 2였다면 

가로의 길이를 인덱스로 한 배열을 선언하고 , dp[i] = dp[i-1] + dp[i-2] 가 나올 것이다.

(직전 타일 가로 길이에서 타일 세로로 세워서 1개 추가하고, 두개 직전의 타일 갯수에서 가로로 눕힌 타일을 붙이니까)

이 문제가 위의 경우와 다른 이유는 세로의 길이가 3이라는 것이다.

가로의 길이가 홀수라면, 타일을 어떻게 채우든 빈 위치가 생겨서 답이 되지 않는다.

    if (n % 2 !== 0) {
        console.log(0);
        process.exit(0);
    }

가로 길이가 1이라면 1*2를 세로로 세우는 방법이 있지만 이 떄의 세로 길이는 2가 되어 위나 아래에 타일을 가로로 눕힌 것을 추가해야한다. 물론 이렇게 세운다면 빈 위치가 생겨서 정답의 조건은 되지 않지만 이후의 가로의 길이들을 측정할 때 사용하기 위해 기록해둔다.

가로의 길이가 2라면,

1) 위에서 만든 가로 길이 1에서 세로로 세운 타일을 하나씩 추가한다 -> dp[1]

2) 가로로 눕힌 1*2 타일 3개를 쌓는다. -> 1

가로의 길이가 3이라면 

1) 가로 길이가 2에서 1개를 추가로 세우지만 위아래로 눕힌 타일도 추가해야한다 -> dp[2]*2

2) 가로 길이가 1에서 가로로 눕혀서 3개를 쌓은 타일을 추가한다 ->dp[1] 

가로의 길이가 4라면

1) 가로 길이가 3에서 1개를 추가로 세우지만 위아래로 눕힌 타일도 추가해야한다 -> dp[3]

2) 가로 길이가 2에서 가로로 눕혀서 3개를 쌓은 타일을 추가한다 ->dp[2] 

위를 통해 홀수와 짝수의 경우를 따로 두어 점화식을 세울 수 있다

const dp = Array.from({ length: n + 1 }).fill(0);
dp[1] = 2;
dp[2] = 3;
dp[3] = 8;
for (let i = 4; i < n + 1; i++) {
    if (i % 2 === 0) {
        dp[i] = dp[i - 1] + dp[i - 2];
    } else {
        dp[i] = dp[i - 1] * 2 + dp[i - 2];
    }
}

정답 코드

const main = (n) => {
    if (n % 2 !== 0) {
        console.log(0);
        process.exit(0);
    }
    const dp = Array.from({ length: n + 1 }).fill(0);
    dp[1] = 2;
    dp[2] = 3;
    dp[3] = 8;
    for (let i = 4; i < n + 1; i++) {
        if (i % 2 === 0) {
            dp[i] = dp[i - 1] + dp[i - 2];
        } else {
            dp[i] = dp[i - 1] * 2 + dp[i - 2];
        }
    }

    console.log(dp[n]);
};

const input = require('fs')
    .readFileSync(process.platform === 'linux' ? '/dev/stdin' : './input.txt')
    .toString()
    .trim()
    .split('\n');

const [n] = input[0].split(' ').map((v) => +v);
main(n);

'코딩 테스트 > 백준' 카테고리의 다른 글

5557번 1학년 (자바스크립트)  (0) 2025.01.04
12869 뮤탈리스크  (0) 2025.01.03
2225 합분해 (자바스크립트)  (0) 2025.01.03
30242 N-Qeen(Easy)  (0) 2025.01.02
9663 N-Queen (자바스크립트)  (0) 2025.01.02