알고리즘

백준 No.1789 수들의 합 - JAVA

jaewoo 2023. 2. 9. 14:09

 

문제

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

 

입력

첫째 줄에 자연수 S가 주어진다.

(1 ≤ S ≤ 4,294,967,295)

 

https://www.acmicpc.net/problem/1789

 

1789번: 수들의 합

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

www.acmicpc.net

 

일단 S의 범위가 크므로 long을 받아서 해야한다. 처음에 int로 했었는데 시간초과...

 

문제 풀이

- 1부터 주어진 숫자까지 for루프를 돌면서 num에 루프 인덱스를 계속 더해 나간다. 그러면 num은 점점 값이 커질 것이고 결국 주어진 값을 넘어갈 것이다. 주어진 값을 넘긴 순간 break를 걸어야 한다. 

- 여기에 문제  조건은 서로다른 N개의 자연수의 최댓값이다. 결국 1부터 최대한 작은 서로다른 자연수롤 더하여 주어진 숫자를 만드는 것치 최댓값이다. 

- 200일 경우 1부터 계속 더해지다가 num이 210일때 for문이 멈춘다. 210까지일 경우 총 20개의 자연수인데 여기서 간단하게 10만 뺴주면 주어진 값과 일치한다. 계속 서로 다른 작은 값(1부터)을 더해 온 것이기에 여기서 더 많은 수를 구할 수 없다. 그렇기 때문에 count에서 1을 빼주면 정답이다.

 

로그로 살펴보면

 

 

import java.util.ArrayList;
import java.util.Scanner;

public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long number = sc.nextLong();
        long num = 0;
        long count = 0;
        for(int i=1;;i++){
            if(num > number){
                    break;
                }    
     
                num += i;
                count++;
               
        }

        System.out.println(count-1);
    }
}