[BOJ][⚪1][백준#15989] 1, 2, 3 더하기 4

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #15989


문제

정수 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는 틀렸단다. 도저히 이해가 되지 않는다.

댓글남기기