728x90
https://www.acmicpc.net/problem/11726
문제
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
'알고리즘 스터디 > 백준 알고리즘 기초 1' 카테고리의 다른 글
[백준 1463번 1로 만들기 - node.js] [알고리즘 기초 1/2] (0) | 2021.08.11 |
---|---|
[백준 11727번 2 x n 타일링 2 - node.js] [알고리즘 기초 1/2] (0) | 2021.08.11 |
[백준 2004번 조합 0의 개수 - node.js] [알고리즘 기초 1/2] (0) | 2021.08.10 |
[백준 1676번 팩토리얼 0의 개수 - node.js] [알고리즘 기초 1/2] (0) | 2021.08.09 |
[백준 17103번 골드바흐 파티션 - node.js] [알고리즘 기초 1/2] (0) | 2021.08.09 |
댓글