자료구조 및 알고리즘/백준

[python] 2839. 설탕 배달

viamemine 2023. 1. 9. 19:07
728x90
반응형
  • 문제


 


  • 잘못된 풀이
N = int(input())

num = N//3
x_3 = [] # 3kg가 x개 있고
y_5 = [] # 5kg가 y개 있을 때
count = [] # 가방 개수구하기

if N%5==0: # 5로 나누어질 때
    print(N/5)
else:
    for i in range(1, num+1): # 1~num까지
        if (N-(3*i))%5==0:
            y = (N-(3*i))/5
            x = (N-5*y)/3
            x_3.append(int(x))
            y_5.append(int(y))
if len(x_3) == 0:
    print(-1)
    quit()
    
for i in range(len(x_3)):
    count.append(x_3[i]+y_5[i])
print(min(count))

 

내가 처음에 짠 코드는 다음과 같이 굉장히 지저분하다.

주어진 N이 5로 나누어 떨어진다면 바로 가방개수를 구할 수 있지만 그렇지 않으면,

N을 3으로 나누었을 때가 5로 나눈 수보다 크기 때문에 for문을 3으로 나눈 수만큼 돈다.

그 중 5로 나머지 없이 딱 나누어 떨어질 때, x(3kg)와 y(5kg) 개수를 구하고

각각 list로 만들어 for문을 다시 돌아, x와 y를 더한 값을 새로운 count라는 list에 넣어주고 min 값을 구한다.

 

문제 예시에 대한 답은 모두 올바르게 하지만,

해당 코드는 list를 3개나 만들고 for문을 두 번이나 도는 방법으로 코드가 매우 더럽고 논리적이지 못하다.

결과적으로 문제 제출을 했을 때 실패가 나왔다... 

 

 

  • 올바른 풀이
N = int(input())

bag = 0
while N >= 0:
    if N % 5 == 0:  # 5로 나누어 떨어질 때 가장 작은 수
        bag += (N // 5)  # 몫을 구해야 정수가 됨
        print(bag)
        break
    N -= 3
    bag += 1  # 5의 배수가 될 때까지 설탕-3, 봉지+1
else:
    print(-1)

 

문제를 다시 어떻게 접근해야할지 고민하던 중 N이 5로 나누어 떨어질 때까지 while문을 도는 방법이 떠올랐다.

이전 풀이는 3kg와 5kg 봉지를 x, y로 생각했지만

해당 방법은 주어진 N에서 3을 빼면서 5로 나누어 문제를 해결한다.

 

 

 

 

 

728x90