Algorithm/BOJ

백준(BOJ) #2839 설탕배달

개발자 뭄뭄 2022. 7. 27. 00:28
반응형

문제

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

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

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

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

예제 입력 1 예제 출력 1

18
4

예제 입력 2 예제 출력 2

4
-1

예제 입력 3 예제 출력 3

6
2

예제 입력 4 예제 출력 4

9
3

예제 입력 5 예제 출력 5

11
3


sugar_kg = int(input()) # 설탕의 무게를 받습니다.
how_many_bags = 0 # 총 몇 봉지인지 구하는 변수

def sugar_kg_5(): # 5가 몇번 들어가는지 몫을 구하는 함수
    return sugar_kg // 5

def sugar_5_kg_remainder() : # 5로 나누었을 때 나머지을 반환하는 함수
    return sugar_kg % 5


# 먼저 5로 나누었을 때 나머지를 0, 3, 그리고 나머지로 분류한다.

if sugar_5_kg_remainder() == 0:
  how_many_bags = sugar_kg_5()
  # 5의 배수인 경우 몫을 출력한다.

if sugar_5_kg_remainder() == 3:
    how_many_bags = sugar_kg_5() + 1
    # 5n + 3의 경우 n+1 봉지를 출력한다.

elif sugar_5_kg_remainder() == 1 or 2 or 4: 
    # kg에서 5로 나눈 나머지가 1,2,4인 경우 
    # 값에서 가장 비슷한 5의 배수를 먼저 제외하고, 3으로 나눠본다.
    # 예를 들면 11이면 10을 먼저 빼고 나머지를 3으로 나눠보고, 아니면 5을 빼고 3으로 나눠본다.
    # 나눠진 값이 3의 배수이면 출력하고, 아니면 맞을 떄까지 5의 배수 수를 줄여가며 같은 작업을 반복한다.
    flag = False
    for i in range (sugar_kg_5(),-1,-1) :
        left_over_3 = (sugar_kg - i*5)%3
        left_over_3_quotient = (sugar_kg - i*5) // 3
        if left_over_3 == 0 :
            flag = True
            how_many_bags = i + left_over_3_quotient
            break
            
    if not flag:
        how_many_bags = -1

print(how_many_bags)

💡
처음에는 ‘-1’ 을 출력하는 것을 어떻게 구현해야 하는지 몰랐다.

옆 자리에 앉은 K님께 여쭤보니, flag 라는 변수를 추가해서 True가 되면 빠져나오고, 계속 False일 경우에 -1을 변수에 넣을 수 있게 해주는! 아주 유용한 코드를 하나 넣어주셨다.

💡
error 2 : break

이게 쮜리가 예전에 풀던 그리딘가 뭔가 하던 거 같은데, 이미 상위에서 답이 나와버린 경우, 반복문 loop를 멈추고 빠져나와야 한다. 그 때 사용해야하는 것이 break 처음에는 break를 쓰지 않아, 예를 들면 21을 입력하였을 때 5가 나와야 하는데 (5*3 + 3*2) 이므로, 3*7 까지 돌아가서 답이 7이 출력되는 결과가 나왔다. 이 때, break 한 줄 더 넣어서 돌리니 바로 정답 처리가 되었다


Uploaded by N2T

반응형