Thief of Wealth

문제

서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?

입력

첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.

출력

첫째 줄에 자연수 N의 최댓값을 출력한다.

 

핵심 아이디어 

서로다른 n개의 수를 합쳤더니 s가 되었고, s가 주어진다.

이때 최대 n을 구하면 되는데,

최대 n을 만드려면 최대한 작은 수를 여러번 사용하기만 하면된다.

하지만 서로 다른 자연수여야 하므로,

1부터 1씩 증가해가며 더해주다가 s가 넘어가는 시점에 멈추고 1을 빼주면된다.

 

예를 들어서 s=200일때

1부터 20까지 차례로 더해보면

1

3
6
10
15
21
28
36
45
55
66
78
91
105
120
136
153
171
190
210

 

순으로 증가함을 알 수 있다.

이때, 완벽하게 200을 만들 수 는 없지만, 

숫자를 살짝 바꿔 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 21 등)

으로 바꾼다면 19개로 200을 만들 수 있다.

 

우리의 목표는 개수를 구하는 것이므로 저렇게 자세한 숫자의 값은 구하지 않아도 된다!

 

'use strict'

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

const solution = function (input) {
    const s = parseInt(input[0]);
    let curr = 1;
    let sum = curr;
    while (sum <= s) {
        curr++;
        sum += curr;
        console.log(sum);
    }
    console.log(curr - 1);

};


const input = [];
rl.on("line", function (line) {
    input.push(line);
}).on("close", function () {
    solution(input);
    process.exit();
});

 

profile on loading

Loading...