촉촉한초코칩

[백준] 1789(수들의 합) Python 본문

Algorithm

[백준] 1789(수들의 합) Python

햄친구베이컨 2025. 6. 4. 21:49

문제

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

입력

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

출력

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


문제점. N이 연속된 수가 아니라면 자연수의 합인 S을 어떻게 찾을 것인지?

GPT한테 물어보니까 작은수부터 더해서 S를 찾으라고 함..

200이 없는.. 불상사가 발생함 

 

입력받은 수부터 값을 빼기로 함

반대로 해도 마찬가지..

 

그러면 연속된 수가 아닐 수도 있으니까, 일단 더하다가 a를 넘어서면 딱 a만큼까지만 더하고 그 수를 최대수로 지정한다.

(sum, i)

이렇게 마지막에 더한 수가 최대값이 아닐 수 있기 때문에 마지막에 더한 값과 마지막 전에 더한 값을 비교해서 가장 큰 수를 최대값으로 지정했다.

a = int(input()) #2
sum = 0

if a==1:
    print(1)

for i in range(1, a):
    sum+=i #3
    print('sum:',sum,'i:',i) 

    if sum>a:
        tmp = sum-i #210-20=190으로 돌려놓기
        ttmp = a-tmp #S까지 몇 더하면 되는지
        i-=1
        if ttmp>i:
            print(ttmp)
        else:
            print(i)
        break
    if sum==a:
        print(i)
        break

계속 틀렸다고뜸

뭔가 반례가 있나 봄

 

왜 안되나 했는데..출력초과라고 떠서 검색해보니 

마지막 한줄이 더 출력되어서 그렇대.. 근데 이전에도 자동 줄바꿈때문에 한줄 더 출력된적 많았는데..? ...

 

아 그리고 2도 1로 출력되도록 처리해주어야 한다.

a = int(input()) 
sum = 0

if a==1 or a==2:
    print(1,end='')

for i in range(1, a):
    sum+=i #3

    if sum>a:
        tmp = sum-i #더하기 전으로 돌려놓기
        ttmp = a-tmp #S까지 몇 더하면 되는지
        i-=1
        if ttmp>i:
            print(ttmp, end='')
        else:
            print(i, end='')
        break
    if sum==a:
        print(i, end='')
        break