알고리즘/문제풀이

백준[2839] 설탕 배달 (파이썬)

레이튼 2021. 12. 10. 16:52

여러 문제를 풀다 보니 슬슬 재미가 붙는 것 같다.

처음으로 브론즈에서 가장 높은 티어의 문제를 풀었다.

가장 효율적인 코드인지는 잘 모르겠지만 뿌듯한 감이 있다.

 

5x + 3y = n이라는 식을 이용해 풀었다.

x는 반복되지 않아야 해서 위에 미리 저장을 해 고정시켰다.

 

5가 더 큰 값이기 때문에 x를 기준으로 삼았다.

먼저 5x를 식 오른쪽으로 넘겨 새로 저장해주었다.

반복문 속에서 n을 계속 사용해야 해서 m이라는 새로운 변수로 저장했다.

x값을 점차 줄여나가면서 y에 들어갈 수 있는 값을 확인했다.

n으로 딱 떨어지면 바로 반복문을 빠져나갈 수 있도록 했다.

또는 x로 더 이상 검사할 수 없을 때 반복문을 빠져나가도록 했다.

 

아래 코드에 주석으로 상세한 설명을 붙여놓았다.

 

n = int(input())

# 5x + 3y = n을 이용
x = n // 5  # 반복되면 안되는 x를 미리 저장

while 1:
    m = n - 5 * x  # 3y를 만들어 줌. n값을 바꿀 수 없어 새로운 변수 형성
    y = m // 3  # 몫을 계산해서 y가 될 수 있는 값을 저장
    m = m % 3  # 조건문에서 검사하기 위해 저장해 줌.
    if m == 0 or x == 0:  # 딱 떨어지는 값이거나 x로 더이상 검사할 수 없을 때까지 반복.
        break
    x -= 1  # x값을 줄여나가면서 차례로 검사


if m == 0:  # n으로 떨어지는 값일 경우 결과 출력.
    print(x + y)
else:  # n으로 떨어지지 않을 경우 -1 출력.
    print(-1)