알고리즘

백준 2839 설탕 배달 파이썬 풀이

물에빠진사람 2024. 1. 12. 15:36
반응형

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

 

2839번: 설탕 배달

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

www.acmicpc.net

 

 

문제를 처음 봤을 때, n값을 입력받아 5kg가방으로 최대한 채우고 나머지를 3kg 가방으로 채우고 만약 설탕이 남거나 부족하면 -1, 아니면 가방의 개수를 출력하면 될것이라 생각했다.

 

풀고 나서 에러가 나서 방법을 바꿨다. 코드를 지워버려서 왜 틀렸는지 확인 기억이 나질 않는게 아쉽다... 다음엔 틀린 코드도 따로 보관해놔야겠다.

 

코드 1

def multiples_of_3(n) :
    if n % 3 == 0 :
        answer.append(n//3)
        
def multiples_of_5(n) :
    if n % 5 == 0 :
        answer.append(n//5)

n = int(input())
answer = []
count = 0

multiples_of_3(n)
multiples_of_5(n)
while n >= 5 :
    n -= 5
    count += 1
    if n % 3 == 0 :
        temp = count
        temp += n//3
        answer.append(temp)
answer.sort()
if len(answer) == 0 :
    print(-1)
else :
    print(answer[0])

 

딱 봐도 풀고나서 뜨악! 했다. 코드가 일단 구현해야할 로직에 비해 너무 길었다. 구현하고 나서 함수로 3,5 키로를 따로 계산했어야했을까? 라는 의문이 들었다. 그리고 내가 생각했던 로직과 거리가 있다는걸 볼 수 있다. 생각했던 로직은 5kg 가방을 최대한 많이 쓰는 방법인데 코드에서는 5kg가방 하나당 3kg 몇개를 쓰는지를 계산한다. 어차피 answer리스트에 담아서 제일 적은 수를 출력하기에 결과적으로 답은 나오지만 너무 비효율적이라는 생각을 했다.

 

코드 2

n = int(input())
count = 0

while n >= 0 :
    if n % 5 == 0 :
        count += n//5
        print(count)
        break
    n -= 3         # 3kg를 빼는 이유는 5kg가방을 최대한 많이 써야 가방의 갯수를 줄일 수 있기 때문
    count += 1

if n < 0 :
    print(-1)

 

그래서 다시 짠 코드이다. 코드 1에서 함수 multiple of 5는 아예 제역할을 못하는 듯해서 없앴고 multiple이 하고 있던 유일한 예외처리가 n이 3일 경우였기 때문에 while문을 0이상으로 바꾸고 생각했던 로직에 맞게 5kg가방을 최대한 소지할 수 있는 방향으로 코드를 구현했다. 

 

이 후에 알게 된건, while-else문의 존재였다. 나는 if문을 사용해서 가방으로 정량을 담지 못했을 경우를 처리했지만 while-else문을 사용할 수 있단걸 알게 되었다. 그치만 while-else와 for-else문은 파이썬에만 존재하는 독특한 문법이라고 해서 조금은 사용을 자제해볼까 한다. 나는 파이썬을 주 언어로 사용할 생각이 없고 코딩테스트할때만 사용하려고 하기 때문에 아직 초보일때는 조금은 정직하게 짜보고 문법의 사용법 정도만 익혔다.

반응형