[Greedy] 백준 1789 문제: 수들의 합-python

Hiyalobi·2024년 6월 14일

백준

목록 보기
1/1
post-thumbnail

개인적으로 왜 틀린지 조건 찾는데 오래 걸렸었다...
너무 간단했지만..

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

문제

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

입력

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


출력

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


문제 분석

자연수의 합 S까지 도달하는데에 필요한 겹쳐지지 않은 자연수 개수의 최댓값을 구하는 것이다.

1씩 증가되는 자연수를 더하면서 최댓값인 N을 구한다.
이 예는 출력 예시 1인 200에 19가 출력된 사실을 보면 확인할 수 있다.

1+2+3+4+...18+19 = 190이고,
1+2+3+4+...18+19+20 = 210이다.

이때, 1부터 증가시킨 값들은 해당 합을 구할 수 있는 최소한의 값으로 따라서 1부터 N까지의 합이 S보다 큰 수 전의 N 값이라 할 수 있다.

1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+17+20+21+22와 같이 N은 19이고 합은 200이 나오는 결과를 확인할 수 있다. 이처럼 N이 19이면, 이후의 값은 조정하여 합을 구하는 것이 가능하다는 의미로, 자연수 개수의 최댓값을 이야기한다.

만약 N을 20이라면, 이미 210으로 최소한의 자연수들을 합한 값에서 값이 초과하게 된다.
따라서 1부터 N까지 합한 값이 S를 넘기지 않는 최대의 값 N을 구하는 문제이다.

참고 : https://www.acmicpc.net/board/view/17063
:https://www.acmicpc.net/board/view/119427

풀이 코드 1 - while

s = int(input())	# S 입력

cnt = 0	# counter
sum = 0	# total Sum
while True:
    cnt = cnt + 1 # 1부터 카운트
    sum = cnt + sum # cnt까지 합한 값
    if sum > s:	# cnt까지의 Total sum이 S보다 더 크다면
        result = cnt	
        break	# 종료

print(result-1)	# S를 넘기지 않는 이전 값 출력

코드 해설

while 구문으로 풀이한 코드이다.
해당 코드의 경우 1부터 카운트를 위한 flag 변수인 cnt로 1씩 더하면서 카운트를 진행한다.
이후, 1+2+...+cnt와 같이 cnt까지의 total 합을 구하고, 해당 합이 s보다 크다면, S를 넘기지 않는 이전 값을 출력한다.

이 코드의 경우 가장 노멀하고 S값을 초과하는 변수 이외 다른 조건을 생각하지 않아도 괜찮다.


풀이 코드 2 - for

s = int(input()) # S 입력

result=0	# 결과
sum = 0	# total sum
if s == 1 :	# S가 1인 경우
    result = 1 
else:	# S가 1이 아닌 경우
    for i in range(1, s+1):	# 1부터 S까지 카운트
        sum = i + sum	# i 값 까지 합한 값
        if sum > s: # i까지의 total sum이 S보다 크다면
            result = i - 1	# S를 넘기지 않는 이전 값 출력
            break	# 종료


print(result)

코드 해설

문제의 코드이다...

해당 코드에서는 1에 대한 조건을 명시하였다.
이전 while의 코드에서는 1에 대한 조건이 없어도 괜찮았던 이유는 while에서 1의 값을 처리시, -1을 할 때 2 - 1로 처리가 되어 최종적으로 1이 출력된다,
for 구문의 경우 if 구문 없이 아래 부분만 처리하면, i=1만 처리되기 때문에 1번만 반복문이 진행되고 이후부터 진행되지 않는다.
따라서 값을 출력해 보면 0이 출력되는 사실을 확인할 수 있다.
따라서 위의 코드 처럼 if문으로 1을 처리하거나, 또는 무한루프로 만들어 제한을 없애도록 코드를 제작해야 오류를 해결할 수 있다.

profile
유영하다

0개의 댓글