본문 바로가기
Algorithm

[Programmers] 132267.py 콜라 문제

by roses16 2023. 6. 3.

언제나 그렇듯 문제 그대로 풀어서 해결

def solution(a, b, n):
    answer = 0

    while True:
        if n < a:
            break

        answer += ( n // a ) * b
        n = ( n // a ) * b + n % a

    return answer

이번 문제는 교환 횟수만 잘 계산하면 반복문을 사용하지 않고도 해결할 수 있을 것 같아 고민했는데
사칙연산을 어떻게 조합해봐도 해결하지 못해서 다른 분의 풀이를 보고 아래와 같이 이해했다.


def solution(a, b, n):
    return (n - b) // (a - b) * b

주어진 갯수 n에서 매 교환 시마다 a - b개의 콜라가 소모된다.
즉, 교환 횟수는 n // (a - b)로 표시할 수 있다.

 

다만, 이는 교환 시 a개를 제공해야한다는 조건이 제외되어있다.
예를 들어 n = 20, a = 3, b = 1 일 때의 답은 9 이지만 위 계산식 n // (a - b)는 10이 출력된다.

※위 예시에서는 1회만 추가되었으나 a와 b의 값에 따라 횟수가 추가되지 않거나, 다회 추가될 수 있다.

 

때문에 n - b를 사용한 것으로 보이는데, 왜 꼭 b여야 하는지 이해가 어렵다.


a > b 이므로 n // (a - b)의 경우 b를 돌려받지 못하는 교환은 꼭 1회 이상 발생한다. 라는 전제로 생각했었는데 예시에 따라 달랐다. n = 20, a = 10, b = 3의 예시에서는 20 - 13 - 6 총 2회 교환이 발생하는데, 돌려받지 못하는 교환이 발생하지 않고, 정답도 2회로 일치했다.

 

n부터 a - b만큼 줄어드는 수열로 표현해서 생각했을 때에는 횟수 조정에 a > x >= b 의 조건을 만족하는 값을 사용해야한다는 것까지는 생각했는데 b가 아닌 값은 모두 오류가 있었다.

 

설명에 올라온 글들도 찾아보았는데, - b 에 대한 부분만 명확하지 않았다. 😥