목차
문제
링크
https://www.acmicpc.net/problem/2133
문제
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.
입력
첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다.
출력
첫째 줄에 경우의 수를 출력한다.
주저리
쉽지않은 문제였다 정답을 보면서했다 ㅠ
풀이는 일단 마지막에 3이 채워지려면 2칸을 차지하는 3가지의 수가있다.
그리고 홀수들은 답이 되지못하는거 까진 알았다.
그럼 이제 짝수번부터 계산을 해야한다.
풀이
입력 데이터 처리
- 파일 시스템 모듈(fs)을 사용하여 입력을 받습니다. 주석 처리된 부분은 실제 실행 환경에서 사용될 예정이며, 테스트를 위해 input 변수에 데이터를 직접 할당합니다.
- 입력 데이터는 문자열에서 숫자로 변환되어 처리됩니다.
타일링 함수 testF
- arrays는 각 길이의 보드를 채울 수 있는 방법의 수를 저장합니다. 초기 값 arrays[1]은 1로 설정됩니다.
- 길이가 짝수일 때만 타일링이 가능하므로, 홀수 길이의 경우 0을 반환합니다.
- 길이가 2인 경우는 기본적으로 3가지 방법이 있습니다.
- 길이가 4 이상인 짝수의 경우, 동적 프로그래밍을 이용하여 이전 결과를 바탕으로 가능한 타일링 방법의 수를 계산합니다. 이 때, 3 * arrays[l]는 직전 값에 3배를 해주는 것으로 기본 2x1 또는 1x2 타일이 추가되는 경우를 고려합니다. 2 * arrays[l]은 특수한 타일링 형태가 추가되는 경우를 고려합니다.
솔루션 함수 solution
- 입력 길이가 홀수인 경우, 타일링이 불가능하므로 0을 출력합니다.
- 짝수 길이의 경우, testF 함수를 호출하여 결과를 계산하고 출력합니다.
코드
// 타일 채우기
var fs = require('fs');
// var input = fs.readFileSync('/dev/stdin').toString();
let input = `8`
let real = input.trim().split("\n");
let arrs = [1];
function testF(N, rest, arrays) {
for (let i = 1; i <= N; i++) {
if (i === 2) {
arrays[i] = 3;
}
else if (i % 2 !== 0) {
arrays[i] = 0;
}
else {
arrays[i] = 0;
// i === 4
let l = i - 2;
while (l !== -2) {
// console.log({ l, i })
if (l === (i - 2)) {
arrays[i] += 3 * arrays[l];
} else {
arrays[i] += 2 * arrays[l];
}
l -= 2;
}
}
}
}
function solution(real) {
let [T, sec] = real;
// let rest = sec.split(" ").map(Number);
if (Number(T) % 2 !== 0) {
console.log(0)
return;
}
testF(Number(T), 0, arrs)
console.log(arrs[arrs.length - 1])
}
solution(real);
'백준 > 골드' 카테고리의 다른 글
[node.js,백준]2580 - 스도쿠 (0) | 2024.05.21 |
---|---|
[node.js,백준]1987 - 알파벳 (0) | 2024.05.16 |
[node.js,백준]13398 - 연속합 2 (0) | 2024.05.11 |
[node.js,백준]11054 - 가장 긴 바이토닉 부분 수열 (0) | 2024.05.10 |
[Node.js,백준]1377 - 버블 소트 (0) | 2024.05.08 |