복대가리의 개발

[C#] 백준 (알고리즘)/실버 문제

[백준 - C#] 1789번 수들의 합

복대가리 2022. 8. 26. 22:54
728x90

문제링크

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

 

1789번: 수들의 합

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

www.acmicpc.net

 

문제

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

조건

시간제한 : 2초
메모리 제한 : 128 MB

입력

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

출력

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

 

문제정리

1. 서로 다른 N개의 자연수의 합은 S
2. N개의 최댓값을 구하자.

이번 문제의 경우 제일 많은 수를 더해 S값을 만들어내는 문제입니다.

즉 제일 작은 수 부터 차근차근 더해 나가여 S값을 만들면 N개의 최댓값을 구할 수 있습니다.

예제 문제에서 200이 나오려면 어떻게 해야하는지 만들어보겠습니다.

1부터 19까지 더하면 190이 되고  => N = 19

1부터 20까지 더하면 210이 됩니다. => N = 20

200을 만드려면 1부터 18까지 더하고 29를 한번더 더해줘야 합니다. => N = 19

즉 처음 S값을 초과한 N의 개수에서 1을 빼주면 되는 문제입니다.

 

아래의 코드를 살펴보면 쉽게 이해할 수 있을 것 같습니다.

 

C# 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void Main(string[] args)
{
    StreamWriter writer = new StreamWriter(Console.OpenStandardOutput());
    StreamReader reader = new StreamReader(Console.OpenStandardInput());
 
    long S = long.Parse(reader.ReadLine());
 
    long N = 0;
    long index = 1;
    long sum = 0;
 
    while (true)
    {
        sum += index++// 자연수 누적
        N++;
 
        if (sum > S) // 누적된 자연수의 값이 S보다 클때 까지 반복
            break;
    }
 
    writer.WriteLine(N - 1);
 
    writer.Close();
    reader.Close();
}
cs
읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.

 

728x90