[BOJ][⚪1][백준#15989] 1, 2, 3 더하기 4
작성:    
업데이트:
카테고리: BOJ Silver I
태그: BOJ, BOJ Silver, PS, Python
문제 출처
문제
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 4가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다.
1+1+1+1 2+1+1 (1+1+2, 1+2+1) 2+2 1+3 (3+1)
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 10,000보다 작거나 같다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
예제
입력
3
4
7
10
출력
4
8
14
My Sol
T = int(input())
arr = [int(input()) for _ in range(T)]
maxx = max(arr)
check = [0, 1, 2, 3]
for i in range(4, maxx+1):
check.append(check[i-3] + (i+2)//2)
for n in arr:
print(check[n])
숫자의 구성이 같으면 같은 수로 취급하는 조건이 잠시 까다로웠던 문제였다. 문제 풀이의 관건은 1, 2, 3의 개수를 각각 x, y, z축으로 두는 3차원 구성으로 생각했을 때, i번째 수는 (i-3)번째 수의 구성에 3을 모두 더한 구성이고, 이는 모두 3을 포함하므로 3을 포함하지 않고 1 또는 1과 2로만 구성되는 경우의 수만 더해주면 된다.
이때 1과 2로만 구성되는 경우의 수는 x, y축의 직각삼각형으로 생각하고, 1의 개수가 2개씩 줄어들 때 2의 개수가 1씩 늘어나는 규칙을 통해 찾아낼 수 있다.
결과
맞았습니다!!
node.js
사실 node.js로 먼저 풀었던 문제이다.
const fs = require("fs");
const [T, ...arr] = fs
.readFileSync('/dev/stdin')
.toString()
.split("\n")
.map((a) => a.trim())
.map(Number);
const max = Math.max(...arr);
const ret = [0, 1, 2, 3];
for (let i = 4; i < max + 1; i++) {
ret.push(ret[i - 3] + Math.floor((i + 2) / 2));
}
arr.forEach((n) => console.log(ret[n]));
똑같은 방식으로 풀었는데 node.js는 틀렸단다. 도저히 이해가 되지 않는다.
댓글남기기