ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1789. [Python]수들의 합
    Python_알고리즘/Silver IV 2023. 1. 30. 22:24

    1. 문제

     

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

     

    1789번: 수들의 합

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

    www.acmicpc.net

     

    2. 접근 방법

     

    • 시간 제한: 2초
    • 메모리 제한: 128MB
    • 수의 합 구하는 방법

     

    3. 파이썬 코드

     

    S = int(input())
    s = S*2
    n = int(1)
    
    # 무한 반복문으로 제일 높은 n의 값을 찾음
    while True:
    # S*2 < n*(n+1) 한 이유는 1~N 까지 합을구하는 식이 n*(n+1)//2 이기 때문이다.
    # s 값이 딱나누어 떨어지지 않는 경우 그 값을 딱 초과했을 때 break를 걸어준다.
    # break 됐을때 count -1 해주는 이유는 값이 한개 더 더해졌기 때문에 빼줘야한다.
        if s < n*(n+1):
            print(n-1)
            break
    # s 값이 같을때 break
        elif s == n*(n+1):
            print(n)
            break
        else:
            n += 1

     

    4. 문제를 풀고난 후 생각

     

    • 문제가 주어진 조건이 거의 없어서 이해를하는데 시간이 걸렸던 문제다.
    • 문제에서는 합의 값이 주어지고 시작하며 이 합을 구하는 방법은 예전 초등학교때 1부터 10까지 합을 구하는 방법으로 1+10, 2+9, 3+8, 4+7, 5+6 => 11*5 처럼 10*11/2 '(n*(n+1)/2)' 식으로 구할 수 있다
    더보기
    예를 들어 10 이라는 합이 주어졌을 경우를 보면

    1 + 2 + 3 + 4 = 10 으로 1,2,3,4의 합으로 나타낼 수 있다. 다른 방식으로 보면 '20 = n*(n+1) => n^2+n-20 = 0' 방정식의 값을 구해보면 (n+5)(n-4)로 n=4 가 나오며 4*5/2 = 10 이라는 값이 나오게 된다.

    위를 보고 n의 값이 갯수가 되는 것을 이해했고 while True를 돌렸을때 특정값들에서는 잘 시행이 되다가 값이 안나올 경우 무한 루프를 돌아가 버리기때문에 s 값보다 커졌을때도 break를 걸어서 무한루프를 탈출 시키고 s 보다 값이 커졌다면 원하는 값을 구하는 갯수보다 +1이 된 것이기 때문에 -1을 해준 값을 출력해줬다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 그리디 알고리즘
    • 가우스 덧셈

    'Python_알고리즘 > Silver IV' 카테고리의 다른 글

    2578. [Python]빙고  (0) 2023.02.05
    10610. [Python]30  (0) 2023.01.31
    11047. [Python]동전 0  (0) 2023.01.30
    2217. [Python]로프  (0) 2023.01.29
    11399. [Python]ATM  (0) 2023.01.26

    댓글

Designed by Tistory.