서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?
입력
첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.
출력
첫째 줄에 자연수 N의 최댓값을 출력한다.
예제 입력 1 복사
200
예제 출력 1 복사
19
서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값을 구하는 문제입니다.
즉, S라는 주어진 합을 초과하지 않으면서 최대한 많은 자연수를 포함하는 N을 찾는 것입니다.
입출력을 살펴보겠습니다.
S라는 주어진 합을 초과하지 않으면서 최대한 많은 자연수를 포함하는 N을 찾는 것입니다.
따라서, 제일 작은 수부터 더하는 것이 전체 합 S을 만드는데 가장 많은 자연수를 포함합니다. 따라서 매 순간 가장 작은 숫자를 선택하므로 그리디 알고리즘 유형이라고 볼 수 있는 문제입니다.
예를 들어, 일 때, 1부터 순차적으로 더하면 1, 2, …, 19까지 포함할 수 있습니다.
이 문제에서 그리디 알고리즘의 특징을 정리하자면 다음과 같습니다:
N
을 0으로 초기화하고, 합계 total
도 0으로 초기화합니다.N + 1
을 더했을 때 total
이 S
를 초과하지 않는 동안, N
을 증가시키고 total
에 현재 값을 더합니다.N
은 가능한 자연수의 최댓값이 됩니다.
import sys
S = int(sys.stdin.readline().strip())
def sol(S):
N = 0
total = 0
while total + N + 1 <= S:
N += 1
total += N
return N
print(sol(S=S))
N
과 total
을 0으로 초기화.total + N + 1 <= S
조건을 만족하는 동안 반복:N
을 1 증가시키고, total
에 추가.N
은 가능한 자연수 개수의 최댓값.import sys
import math
S = int(sys.stdin.readline().strip())
def sol(S):
N = int((-1 + math.sqrt(1 + 8 * S)) // 2)
return N
print(sol(S=S))
math.sqrt
를 사용해 제곱근을 계산.이번 문제는 자연수의 합 S를 구성하기 위해 가능한 가장 작은 자연수부터 차례로 더해나가 최대한 많은 자연수를 포함하는 N을 찾는 문제입니다. 이번 문제는 그리디 알고리즘으로 분류되며, 매 순간 가장 작은 자연수를 선택해 최적의 해를 보장하는 탐욕적 선택 속성을 활용한 문제입니다.
전체 코드는 다음 링크에서 확인할 수 있습니다.
글 읽어주셔서 감사합니다.