본문 바로가기
알고리즘 스터디/백준 알고리즘 기초 1

[백준 11726번 2 x n 타일링 - node.js] [알고리즘 기초 1/2]

by 레일라오리덕 2021. 8. 11.
728x90

https://www.acmicpc.net/problem/11726

 

11726번: 2×n 타일링

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

www.acmicpc.net

 

문제

 

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

 

입력

 

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

 

출력

 

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

 

예제 입출력

 

입력 출력
2 2
9 55

 

풀이[node.js]

 

 

728x90

이 문제는 피보나치 수열을 사용하여 풀 수 있는 문제였다.

2x1개를 채우는데는 1개, 2x2을 채우는데는 2개, 2x3을 채우는데는 3개, 2x4를 채우는데는 5개, 2x5를 채우는데는 8개 이런식으로, 1, 2, 3, 5, 8, 13... 과 같이 피보나치 패턴으로 구해진다는 것을 알 수 있다.

 

문제에서는 10007로 나눈 나머지 값을 출력하라고 했으니, arr에 값을 넣어줄 때 미리 10007로 나누어준다.

이유는, 10007로 나누지 않고 마지막에 arr에 넣은 값을 10007로 나눠서 출력하면 값이 너무 커져서 컴퓨터 내부에서 정상적인 계산이 이루어지지 않기 때문이다.

 

var fs = require('fs');
var inputs = fs.readFileSync('/dev/stdin').toString().trim();
inputs = Number(inputs);
var arr = [0, 1, 2];
if(inputs>2){
    for(var i=3; i<=inputs; i++){
    	arr[i] = (arr[i-1] + arr[i-2]) % 10007;
	}
}
console.log(arr[inputs]);

아래는 내가 처음에 냈던 답이다. 이는 너무 큰 출력 값으로 제대로 계산된 값이 나오지 않는다.

var fs = require('fs');
var inputs = fs.readFileSync('/dev/stdin').toString();
inputs = Number(inputs);
var answer = 0;
var arr = [0, 1, 2];
if(inputs>2){
    for(var i=3; i<=inputs; i++){
    	arr[i] = arr[i-1] + arr[i-2];
	}
}
answer = arr[inputs] % 10007;
console.log(answer);
728x90

댓글