2022. 9. 27. 15:47ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2839
2839번: 설탕 배달
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그
www.acmicpc.net
접근 방법 - 그리디 알고리즘을 이용한 연산 문제
백준의 2839번 문제는 그리디 알고리즘을 응용하여 해결해야 하는 문제이다.
해당 문제는, 주어진 설탕을 3kg, 5kg 봉지로 묶을 때 필요한 봉지의 최소 개수를 출력해야 하는 문제이다.
여기서 그리디 알고리즘이란 "매 선택에서 지금 이 순간 당장 최적인 답을 선택하여 적합한 결과를 도출하는 알고리즘"이다.
이 알고리즘과 관련하여 이전에 풀었던 문제에 대한 설명을 작성한 것이 있으니, 아래의 링크도 함께 참고하면 좋을 것이다.
https://smary-it.tistory.com/203
[백준 BOJ] 11047번 동전 0 (C++/cpp)
문제 설명 https://www.acmicpc.net/problem/11047 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤..
smary-it.tistory.com
사실 필자는 아직 그리디 알고리즘이 익숙하지 않아서 설명이 많이 미숙할 수도 있다. (크흠)
하지만 이 알고리즘이 어색하거나 해당 문제를 푸는 데에 어려움을 겪고 있다면, 아래의 설명과 코드가 도움이 될 것이다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 설탕의 무게(n)를 입력받는다.
2) 설탕을 포장하는 데에 사용할 봉지의 최소 개수를 저장할 변수 cnt를 0으로 초기화하여 선언한다.
3) n이 3 이상의 값을 가지고 있다면 해당 반복문을 수행하여 아래의 연산을 취한다.
(다만, 입력값에서부터 3 아래의 값을 가지고 있다면 애진작에 이 반복문을 수행하지 않도록 한다.)
- 만일 현재 n 값이 5로 나누어 떨어진다면, 이는 5kg 봉지로만 현재 설탕을 포장할 수 있는 상태임을 뜻한다.
따라서 이 경우에는, cnt에 현재 n값을 5로 나눈 몫을 더한다. 그리고 n 값을 0으로 한 뒤에 해당 반복문을 탈출한다.
- 현재 n 값이 5로 나누어 떨어지지 않는다면, 이는 3kg 봉지를 하나 이상은 사용해야 하는 상태임을 뜻한다.
따라서 이 경우엔, n 값에서 3을 뺀 뒤 cnt에 1을 더하고 해당 반복문의 처음으로 돌아간다.
4) 3)의 반복문이 모두 수행된 뒤 n 값이 0이라면, 이는 모든 설탕을 포장 완료했다는 것을 뜻한다.
따라서 이 경우에는, 최종적으로 연산 완료된 cnt의 값을 출력한다.
다만 n 값이 0이 아니라면, 이는 포장되지 못한 설탕이 남아있다는 것을 뜻한다.
이 경우에는, cnt의 값이 아닌 -1을 출력한다.
5) 위에서 출력을 완료하였다면, 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;
//백준 2839번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n;
cin >> n;
int cnt = 0;
while (n >= 3) {
if (n % 5 == 0) {
cnt += n / 5; n = 0; break;
}
n -= 3; cnt += 1;
}
if (n == 0) { cout << cnt << endl; }
else { cout << -1 << endl; }
}
제출 결과
(2022.04.08 백준 2839번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 17478번 재귀함수가 뭔가요? (Java) (0) | 2022.09.28 |
---|---|
[백준 BOJ] 2420번 사파리월드 (C++/cpp) (0) | 2022.09.28 |
[백준 BOJ] 17826번 나의 학점은? (C++/cpp) (0) | 2022.09.27 |
[백준 BOJ] 3711번 학번 (C++/cpp) (0) | 2022.09.27 |
[백준 BOJ] 11942번 고려대는 사랑입니다 (C++/cpp) (0) | 2022.09.26 |