본문 바로가기
Algorithm/📖Baekjoon

#2839 설탕 배달

by yewoneeee 2022. 4. 11.

# 문제

# 입력 및 출력

# 풀이

처음에 문제를 봤을땐 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

댓글