서로 다른 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;
}
아직도 자료형의 범위를 고려하는 게 익숙하지 않다. 조금만 신경 써보자