본문 바로가기

너와!나의!알고!리즘!/백준

[백준 #2839, Python] 설탕 배달

이것도 일종의 방정식 계수 맞추기.. 숫자를 5의 배수와 3의 배수로 요리조리 잘 쪼개도록 생각해보는게 정말 중요한거 같다..

요즘 애들은 상근이 알려나..

[문제]

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

 

[풀이]

🐤 무대포 시도 

if N % 5 == 1:
    X = N//5 -1
    N = N - 5*X
    Y = N // 3
    total = X + Y
    print(total)

elif N % 5 == 3:
    X = N // 5
    Y =1
    total = X + Y
    print(total)

elif N % 5 == 0:
    total = N // 5
    print(total)

elif N % 3 == 0:
    total = N // 3
    print(total)

else:
    print(-1)

ㅋㅋㅋㅋ진짜 제시된 예시들만 통과할 수 있는? 아니 그마저도 못하는 단순의 끝판왕으로 생각했다.. 19같은거는 쪼개지도 않고 그냥 안돼..

🐔 통과 풀이

N=int(input())
total = 0

left = N % 5
mok = N // 5

while mok > -1:
    if N % 5 == 0:
        total = N //5
        print(total)
        break

    M = N - (mok)*5
    
    if M % 3 == 0:
        total = (mok)+(M//3)
        print(total)
        break
    else:
        mok -= 1
        left += 5
        total = 0
if total == 0:
    print(-1)

세현이랑 밥먹으면서..며칠동안 고민했는데 임세가 현답을 내려주었다. 우선, 5로 나눈 몫과 나머지에서 시작해서, 나머지가 3의 배수가 될 때 까지 반복시켜준다. 이 때, 몫은 1씩 감소시키고 나머지는 5만큼 증가시킨다. 그런데 우선 숫자가 5의 배수이면, 5로 나누는게 가장 최소가 되니까 5의 배수인지 부터 판별한다. 처음에는 이 5의 배수 판별을 while문 밖에 배치했는데, 그렇다보니까 5의 배수일 때 2번 출력이 되서 통과하지 못했었다.. (종백님,,천재만재,,) 그래서 while문 안으로 배치하고 5의 배수이면 break를 걸어주었다.