# BOJ01789 수들의 합

https://www.acmicpc.net/problem/1789 (opens new window)

서로 다른 N개의 자연수의 합은 S이다. S를 알 때, 자연수 N의 최대값을 구한다.

1부터 값을 증가시키며 S에 근접한 수를 만들어준다. 만약 S의 값이 50이라고 가정하자.

1 = 1
1 + 2 = 3
1 + 2 + 3 = 6
1 + 2 + 3 + 4 = 10
1 + 2 + 3 + 4 + 5 = 15
1 + 2 + 3 + 4 + 5 + 6 = 21
1 + 2 + 3 + 4 + 5 + 6 + 7 = 28
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55

count를 증가시키며 자연수를 더하다 보면 50보다 크고 가장 근접하는 55를 얻게 되었다. 여기서 s55의 차이는 기존에 더한 자연수포함되는 것을 보장한다. 즉 10보다 작은 자연수일 것이다. 그렇기 때문에 5055의 차이인 5를 뺀 총 9개가 자연수 개수의 최대값인 N이 된다.

아래는 최종 코드이다.

import java.util.Scanner;

public class BOJ1789 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        long s = scanner.nextLong();

        long count = 1;
        long sum = 1;

        // count를 증가시키며 더해준다.
        while (sum < s) {
            sum += ++count;
        }

        // 합산 결과가 s보다 큰 경우 count를 줄여준다.
        if (sum > s) { 
            count--;
        }

        System.out.println(count);
    }
}
#algorithm #BOJ #수학 #그리디 알고리즘
last updated: 10/10/2021, 6:09:25 PM