# 문제
# 입력 및 출력
# 풀이
처음에 문제를 봤을땐 5kg짜리 봉지를 많이 쓰는게 좋다고는 생각을 했었는데 코드를 대충 짜다보니 케이스를 나누는게 편할 것 같아서 케이스를 나눠서 코드를 짰다
#include <iostream>
using namespace std;
int find_min[4];
int main() {
int N;
cin >> N;
for (int i = 0; i < 4; i++) {
find_min[i]=5000;
}
if (N >= 5) {
if (N % 3 == 0) find_min[0] = N / 3;
if (N % 5 == 0) find_min[1] = N / 5;
if (N % 5 == 4) find_min[2] = N / 5 + 2;
if (N % 5 == 1 || N % 5 == 3) find_min[2] = N / 5 + 1;
}
else {
if (N % 3 == 0) find_min[3] = 1;
else {
cout << -1 << endl;
return 0;
}
}
int min = 5000;
for (int i = 0; i < 4; i++) {
if (min > find_min[i]) min = find_min[i];
}
cout << min << endl;
}
입력받은 N의 나머지별로 케이스를 분류해서 그 중에서 최소값을 찾는 방식으로 했다
예제의 출력은 제대로 되는데 틀렸다고 나와서 좀 짜증났지만 구글링부터 했다
근데 남의 코드를 보면 진짜 공부가 안될 것 같아서 내가 스스로 해보기로 하고 코드 말고 다른 사람들이 써놓은 코멘트 정도만 읽었다
이 말을 보고 코드를 쉽게 짰다
거의 힌트를 다 주긴했는데ㅋㅋㅋ
아래가 정답 코드임
#include <iostream>
using namespace std;
int main() {
int N, share, mod;
cin >> N;
share = N / 5;
mod = N % 5;
if (mod == 0) {
cout << share << endl;
return 0;
}
while (true) {
if (mod % 3 == 0) {
cout << share + mod / 3 << endl;
return 0;
}
else {
share--;
mod += 5;
}
if (share < 0) {
cout << -1 << endl;
return 0;
}
}
}
훨씬 직관적으로 변하긴 했다
이걸 작성하고 나서 틀린 코드를 다시 보니까 아마
이 부분에서 케이스 분류가 제대로 안된것 같다
나누어 떨어지지 않으면 5를 더하고 3으로 나눠떨어지는지 계속 확인하면서 값을 구하는데
위 코드는 한번밖에 안돌아서 제대로 케이스 분류가 안 된 것 같다
이 문제를 dp로도 풀 수 있던데 그건 내일 풀어보도록 하겠다,,
아래 풀이보면 코드가 굉장히 짧은데 어떻게 저렇게 술술 푸는거지ㅋㅋㅋ
https://reakwon.tistory.com/126
[알고리즘] 백준 BOJ 2839번 설탕 배달 - 두 가지 해설(C, C++)
www.acmicpc.net/problem/2839 2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕
reakwon.tistory.com
'Algorithm > 📖Baekjoon' 카테고리의 다른 글
#10942 팰린드롬? - 미완 (0) | 2022.04.13 |
---|---|
#11404 플로이드 (0) | 2022.04.12 |
#7579 앱 (0) | 2022.04.10 |
#10830 행렬 제곱 (0) | 2022.04.09 |
#2749 피보나치 수 3 (0) | 2022.04.08 |
댓글