728x90
[BOJ 2839] 설탕 배달 - [그리디/수학]
문제 링크
https://www.acmicpc.net/problem/2839
문제 요약
설탕 $N$kg을 3kg봉지와 5kg봉지를 사용하여 정확하게 배달해야 할 때, 사용하는 봉지의 최소 개수를 구하는 프로그램 작성 (정확하게 나누어 떨어지지 않으면 -1 출력).
접근 방법
- 자료구조: 정수형 변수 (int)
- 알고리즘: 그리디 알고리즘 (Greedy Algorithm)
- 핵심 아이디어: 1. 가장 큰 단위인 5kg 봉지를 최대한 많이 사용하는 것이 유리함. 2. 현재 무게 $N$이 5로 나누어떨어질 때까지 $N$에서 3kg을 하나씩 빼면서 봉지 개수를 증가시킴. 3. 만약 $N$이 0보다 작아지면 불가능한 경우로 판단.
풀이 코드
#include <iostream>
using namespace std;
int main() {
// 입출력 최적화
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
int total_bags = 0;
while (N >= 0) {
// 5로 나누어 떨어지는 경우, 가장 큰 단위로 나머지를 모두 채움
if (N % 5 == 0) {
total_bags += (N / 5);
cout << total_bags << "\n";
return 0;
}
// 5로 나누어 떨어지지 않으면 3kg 봉지 하나를 사용
N -= 3;
total_bags++;
}
// N이 0 미만이 될 때까지 나누어 떨어지지 않은 경우
cout << -1 << "\n";
return 0;
}
시간/공간 복잡도
- 시간 복잡도: $O(N)$
- $N$이 최대 5000이며, 최악의 경우 3씩 줄여나가므로 약 1666번 연산함. 상수 시간에 수렴하여 매우 빠름.
- 공간 복잡도: $O(1)$
- 별도의 배열을 사용하지 않고 변수 몇 개만 사용함.
실행 결과
- 메모리: 2020 KB
- 시간: 0 ms
핵심 포인트
- 그리디의 기준: 5로 나누어떨어지는 시점이 최적의 해라는 점을 포착하는 것이 중요합니다.
- 반복문 종료 조건: $N$이 0보다 작아지는 순간은 정확한 배달이 불가능한 조합임을 의미합니다.
- 효율성: DP로도 풀 수 있지만, 수학적/그리디 접근이 훨씬 직관적이고 메모리 사용량이 적습니다.
예제 확인
- 예제 1 (18): 5로 안 나눠짐 → 15(3kg1) → 5로 나눠짐(5kg3) → 결과: 4
- 예제 2 (4): 5로 안 나눠짐 → 1(3kg1) → 5로 안 나눠짐 → -2(3kg1) → 결과: -1
- 예제 5 (11): 5로 안 나눠짐 → 8(3kg1) → 5로 안 나눠짐 → 5(3kg1) → 5로 나눠짐(5kg*1) → 결과: 3
728x90
'코딩테스트' 카테고리의 다른 글
| [BOJ 2587] 대표값2 - [수학, 구현, 정렬] (0) | 2026.02.06 |
|---|---|
| [BOJ 2750] 수 정렬하기 - [구현, 정렬] (0) | 2026.02.06 |
| [BOJ 1436] 영화감독 숌 - [브루트포스 알고리즘] (1) | 2026.02.05 |
| [BOJ 1018] 체스판 다시 칠하기 - [브루트 포스] (0) | 2026.02.05 |
| [BOJ 19532] 수학은 비대면강의입니다 - [수학, 브루트포스] (0) | 2026.02.04 |