[C++] 백준 1789번 : 수들의 합

E woo·2022년 7월 11일
0

백준

목록 보기
3/18

문제


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

입력


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

출력


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

풀이


서로 다른 N 개의 자연수의 합을 구해야하므로 자연수들이 가장 작은 값들로 이루어져야 그 값이 최대가 될 수 있을 것이다.

따라서 입력 값 S 에 도달할 때까지 1부터 시작해서 1씩 증가한 값이 계속해서 더해지는 과정 (계차수열) 이 필요하다.

그리고 마침내 입력 값 S 보다 커진 값을 갖는 경우 while 문을 탈출하고 탈출 직전 N 의 값이 증가하였으므로 -1 을 해준 후 결과값을 출력한다.

이 문제에서 주의해야 할 점은 입력 값 S 의 범위를 고려해 최댓값이 4,294,967,295인 long 혹은 unsigned int 형을 사용할 수 있지만 while 문의 연산 과정에서 더해지는 변수는 그렇지 않다.

그 이유는 입력 값 S 이상이 되었을 때가 비로소 출력 값 N 을 구할 수 있기 때문에
S 와 비교하는 변수는 unsigned int 형의 최댓값인 4,294,967,295을 넘어 갈 수 있다.

따라서 해당 변수는 반드시 long long 으로 선언해야 한다.

코드


#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    long long S;
    long long sum = 0;
    int n = 1;
    int N = 0;
    cin >> S;
    
    while(sum <= S)
    {
        sum += n;
        n++;
        N++;
    }

    cout << N - 1;
    return 0;
}

느낀점

아직도 자료형의 범위를 고려하는 게 익숙하지 않다. 조금만 신경 써보자

profile
뒘벼

0개의 댓글