문제
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
출력
상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.
내가 쓴 코드1 (틀림)
from sys import stdin; input = stdin.readline
N = int(input())
num1 = num2 = num3 = int(1e9)
five_kg = three_kg = 0
# N이 5의 배수라면
if N % 5 == 0:
num1 = N // 5
# N이 3의 배수라면
elif N % 3 == 0:
num2 = N // 3
# 5, 3 적절히 나누기
sugar = N
while sugar:
if sugar < 3:
num3 = int(1e9)
break
# while문 처음 들어왔으면 num3 변수 초기화
if sugar == N:
num3 = 0
if sugar >= 5:
sugar -= 5
num3 += 1
elif sugar >= 3:
sugar -= 3
num3 += 1
if sugar % 5 == 0:
num3 += sugar // 5
sugar = 0
elif sugar % 3 == 0:
num3 += sugar // 3
sugar = 0
# 그 중 최소 개수 구하기
ans = min(num1, num2, num3)
if ans == int(1e9):
ans = -1
print(ans)
내가 쓴 코드2 (맞)
from sys import stdin; input = stdin.readline
sugar = int(input()) # 배달해야 하는 설탕 kg수
# 최대한 5의 배수를 만들기 전략
bongji = 0 # 봉지 수
while sugar: # sugar가 0이 될때까지 반복
if sugar % 5 == 0:
bongji += sugar // 5
# 무조건 sugar = 0 이 됨 -> break
break
if sugar < 3: # sugar 가 1kg or 2kg 남아있으면 배달 불가능
bongji = -1
break
sugar -= 3 # sugar 가 5의 배수가 될때까지 3kg 씩 담기
bongji += 1
print(bongji)
처음에 만만하게 보고 풀었는데, 주어진 테케도 다 안맞았다...
그래서 2트때 더 많은 경우의 수를 고려해서 코드를 추가해서 주어진 테케는 다 맞았는데... 제출하니 틀렸다..
그래서 3트..는 정답코드를 찾아보았다..ㅎㅎ 근데 경악을 금치 못함,, 왤케 짧은거야!! 나 혼자 너무 복잡하게 생각하고 푼 것 같다. 5kg 짜리에 focus 해서 풀었으면 될 문제였다.. 후 하 ! (두 번쨰 코드는 아이디어만 이해해와서 혼자 쓴 코드임!)
이 문제의 포인트는 => 최대한 5kg 로 담기! = 최대한 5의 배수로 만들기!! 이었다.. ㅎ^^
아 처음 코드 정말 부끄럽게 이상하게 짰네;;
제출 결과

'Algorithm > Python' 카테고리의 다른 글
| [BOJ #12789] 도키도키 간식드리미 (1) | 2024.03.29 |
|---|---|
| [BOJ #2805] 나무 자르기 (0) | 2024.03.28 |
| [BOJ #24482] 알고리즘 수업 - 깊이 우선 탐색 4 (2) | 2024.03.25 |
| [BOJ #1713] 후보 추천하기 (2) | 2024.03.21 |
| [BOJ #1991] 트리 순회 (1) | 2024.03.21 |