공부 스토리/Programming / / 2020. 10. 27. 00:29

[이것이 코딩 테스트다 with Python] 그리디 알고리즘 문제풀이 - 1이 될 때까지

목차

    반응형

    내 풀이 - 1차

    """
    ### 동빈나 <이것이 코딩테스트다> 실전 문제
    ## 그리디 알고리즘 - 3. 1이 될 때까지
    
    # 난이도 '하' / 시간제한 1초 / 메모리 제한 128MB / 기출: 2018 E 기업 알고리즘 대회
    # 풀이 시간제한: 30분
    """
    
    """
    N: 1로 만들 숫자 
    K: N을 나눌 숫자 
    
    Result: 주어진 N이 1이 될 때까지 걸리는 최소 횟수
    """
    
    N, K = map(int, input().split())
    result = 0
    
    while True:
        if N == 1:
            break
    
        if N % K == 0:
            N /= K
        else:
            N -= 1
        result += 1
    
    print(result)

    풀이 설명

    - 1을 빼거나 K로 나누는 작업을 수행하여 N이 1이 되도록 하는 최소 횟수를 구해야 함

    - K로 나누는 작업을 최대한 많이 하는 것이 포인트

    - while문 안에서 K로 나눌 수 있을 경우에는 계속해서 나누고, 그렇지 않을 경우에만 1을 뺌

    내 풀이 - 2차 (해설 본 후)

    N, K = map(int, input().split())
    result = 0
    
    while True:
        # N이 K의 배수가 될 때까지 1씩 빼기
        target = (N//K) * K
        result += (N - target)
        N = target
    
        # N이 K보다 작아져서 더 나눌 수 없을 때 break
        if N < K:
            break
    
        result += 1
        N //= K
    
    # 남은 수에 대해 1씩 빼기
    result += (N - 1)
    print(result)

    풀이 설명

    - N이 엄청 큰 수일 경우에도 빠르게 처리하려면 N과 가장 가까운 K의 배수를 찾아 그 차를 구하여 결과에 더하고, 이후 나누는 작업을 계속 진행

    - 즉 1을 빼는 연산을 한 번에 구해서 result에 더해주는 것

    궁금한 점

    - 마지막에 "result += (N - 1)"은 "result -= 1"로도 충분할 것 같은데 (주어진 테스트 케이스에서는) 굳이 N-1이어야 하는 이유가 있을까?

    - 현재 주어진 테스트 케이스에서는 while문을 빠져나올 때 이미 N == 0인 상태임

    - N이 while문을 빠져나올 때 0이 아닌 테스트 케이스가 주어지면 이해하기가 좀 더 편할 것 같다.

    궁금증 해결!

    같은 궁금증을 가지고 계시던 분이 나동빈님 GitHub에서 질문을 해주셨다.

    결론은 result -= 1이 되어도 무방하다는 것. 그냥 구현의 차이일 뿐이었다.

    반응형
    • 네이버 블로그 공유
    • 네이버 밴드 공유
    • 페이스북 공유
    • 카카오스토리 공유