본문 바로가기
Algorithm/백준

[Python] 백준 1789번 - 수들의 합

by 애기 개발자 2022. 8. 10.
반응형

문제

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

입력

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

출력

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

 


딱 보자마자 1부터 시작하는 등차수열을 하여 마지막 값을 비교하여 되겠구나라고 생각했다.

 

우선 등차수열 공식은

 

$$ S = \frac{n(n+1)}{2} $$

 

처음에는

(오답 코드)

s = int(input())
a = 1
while True:
  result = (a*(a+1))/2
  if result >= s:
    print(a-1)
    break
  a += 1

위와 같이 작성했다.

 

하지만 돌려본 후 틀렸습니다. 를 확인하고 다시 보니 s = 3 일 때 무작정 a-1을 해서 1이 나온 것이다.

 

3 = 1 + 2로 2가 나와야 한다.

 

그래서 조건을 수정했다.

 

s = int(input())
a = 1
result = 0
while True:
  result = (a*(a+1))/2
  if result >= s:
    break
  a += 1

if result == s:
  print(a)
elif result - a < s:
  print(a-1)
else:
  print(a)

위 코드는 정말 무식하게 다시 나눈 방법이고

 

다시 생각해서 코드를 작성하였다.

(찐 정답 코드)

s = int(input())
n = 1
while n * (n + 1) / 2 <= s:
    n += 1
print(n - 1)

while True가 아닌 while에 규칙을 주었고

 

마지막에 나온 수에서 n-1을 하는 방식으로 바꾸었다.

 

이후 다른 정답자의 코드를 보고 어이가 없었다.

 


print(int(((int(input())*8+1)**.5-1)/2))

이 한 줄이 정답이다.

 

어떤 방식으로 저런 수식을 도출해냈는지.. 나는 모르겠다.

반응형

댓글