데이터분석가 | 취준생

[백준] 2839번 설탕배달 본문

백준

[백준] 2839번 설탕배달

su_hyeon 2025. 5. 24. 18:01

백준의 해당 문제는 링크를 통해 들어가서 풀어볼 수 있다.

 

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

 

문제

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

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

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

입력

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

출력

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

정답

n = int(input())

result = -1

for five in range(n // 5, -1, -1):
    rest = n - (five * 5)
    if rest % 3 == 0:
        three = rest // 3
        result = five + three
        break

print(result)

 

공부한 내용

 이전까지 구현 문제를 풀다가 다른 알고리즘이랑 병행하면서 풀어야겠다고 생각했다. 그 이유는 구현문제만 풀다보니까 하나의 알고리즘에 계속 갇혀있는 것 같기도 하고, 조금 생소한 문제들이 나왔을 때 다른 알고리즘을 함께 사용해서 풀어야 하는 문제들이 보였기 때문이다.

 

그래서 일단 Dynamic Programming, 일명 DP라고 불리는 알고리즘 문제를 풀어보기 시작했다. DP 문제에 대한 자세한 설명은 다음 포스팅에 진행해보도록 하고, 이번문제의 풀이부터 적어보도록 하겠다.

 

N = 최종 설탕의 무게를 3킬로그램과 5킬로그램의 봉지를 나누어서 나르는데, 이 횟수가 가장 적은 봉지 갯수를 출력하면 되는 문제이다. 무작정 if문을 사용해서 풀어보려고 했는데, 쉽지 않았다. 3킬로와 5킬로, 3과 5킬로 모두 사용해서 봉지를 나르는 횟수를 구하는건 쉬웠는데, 그 중에서 가장 작은 최솟값을 구하는게 어려웠다.

 

해답은 5킬로그램의 봉지를 가장 먼저 사용해서 횟수를 구한 뒤에 남은 무게를 3킬로그램 봉지로 나르는 횟수를 구하는 것이었다.

 

위의 코드를 보면, 먼저, n 무게를 5로 나눈 몫을 five라는 변수에 넣은 뒤에 남은 무게를 계산하는 값을 rest라는 변수에 담는다. 그 후 남은 무게가 3킬로그램으로 나누어지면, three라는 변수에 (남은 무게 / 3) 한 값을 넣은 후 result값에 five + three를 한 값으로 갱신해준다.

'백준' 카테고리의 다른 글

[백준] 2884 알람시계  (0) 2025.05.25
[백준] 1로 만들기  (0) 2025.05.24
[백준] 1157번 단어공부  (0) 2025.05.23
[백준] 10809번 알파벳 찾기  (1) 2025.05.23
[백준] 2675번 문자열 반복  (0) 2025.05.23