상세 컨텐츠

본문 제목

[백준] 2839 설탕배달 실버 4 C++

알고리즘/C++

by 셉인 2023. 7. 22. 07:14

본문

728x90

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

경우를 나눠서 풀었다

더 간단하게 푸는 방법이 있으려나? -> 그리디 알고리즘 이용하기

수가 간단한 5와 3이어서 5는 큰 영향을 끼치지 않고 3으로 인해서 -1이 될 것인지. 아니면 값이 제대로 출력 될 것인지가 결정된다고 생각했다. 


경우의 수 생각하기

  1. 5로 나눴을 때 0 -> 5의 배수이므로 5로 나눠준 값을 출력해주면 된다
  2. 5로 나눴을 때 1 -> 최소 6이어야지 3*2로 2를 출력해줄 수 있다. N이 3부터 시작이어서 if문이 별 영향은 안끼치지만, 무조건 1이 나머지이려면 6+5*N의 형태여야하므로 6을 빼주고 출력값에 2를 더해준다. (3*2) 그리고 5를 나눠준 값을 출력값에 더해 출력
  3. 5로 나눴을 때 2 -> 최소 12여야한다 왜냐하면 7이라고 치면 5+2 라서 -1을 출력해줘야한다. 그래서 12를 빼주고 출력값에 4를 더해준 뒤 5를 나눠준 값을 출력값에 더해서 출력해준다. 이때 주의할 점은 N에 12를 빼주고 5를 나눠줘야한다.
  4. 5로 나눴을 때 3 -> 최소 3이어야한다. 동일한 과정
  5. 5로 나눴을 때 4 -> 최소 9이어야한다. 14일때 10+4면 -1이 나와버리니 9를 빼주고 5로 나눠줘야한다.

이 로직대로 코드를 구현하였다. 

//설탕배달 실버 4

//21 -> 15+6 if 5로 나눴을 때 1이면 31 5*N +6(최소 6) 5로 나눴을때 2 32 5*N +12(최소 12)
//3 5*N +3 (최소 3) 4 5*N + 9 최소 9
#include <iostream>

using namespace std;

int main (){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int N,count=0;
cin >> N;
while(N){
if(N%5==0){
cout << N/5;
N=0;
}
else if (N%5==1){
if (N<6){
cout << -1;
N=0;
}
else{
count+=2;
N-=6;
count+=N/5;
cout <<count;
N=0;
}
}
else if (N%5==2){
if(N<12){
cout << -1;
N=0;
}
else{
count+=4;
N-=12;
count+=N/5;
cout <<count;
N=0;
}
}
else if (N%5==3){
N-=3;
count+=1;
count+=N/5;
cout <<count;
N=0;
}
else if (N%5==4){
if(N<9){
cout << -1;
N=0;
}
else{
N-=9;
count +=3;
count+=N/5;
cout <<count;
N=0;
}
}
count =0;
}
return 0;
}
728x90

관련글 더보기

댓글 영역