문제 출처
https://www.acmicpc.net/problem/2839
목적 : N kg 배달
제한사항 : 설탕 = 3kg, 5kg으로 구분
설탕 N의 범위 (3<=N<=5000)
요구사항 : 최대한 적은 봉지를 출력
Ex) 18kg인 경우 5kg 3개 3kg 1개 총 4봉지만 배달하면 된다.
idea1 - Greed Algorithm을 이용
=> 항상 최적은 아님
=> 예외상황 존재
idea2 - N을 5로 나눈 몫을 5kg의 갯수 나머지를 3kg으로 나눈 몫을 3kg의 갯수로 정한다.
나머지가 생길경우 -1 return
=> 예외 상황 존재(input이 11인경우 output이 3이 나와야 하나 -1 나옴)
idea3 - 어쨋든 N은 3과 5로만 이루어져야하는 수!!!
=> 5가 최대가 되어야 봉지수가 최대한 적게 나온다!!
=> 이후 3으로 나눈 나머지가 0이면 답!
idea2에서 개선한 idea3 방법이 정답이였다. 이때 출력초과를 얻은 결과가 있는데 이와 같은 경우 값을 찾았음에도 불구하고 반복문을 돌기 때문에 모든 결과값을 출력하는 것을 알 수 있다 따라서 가장 먼저 값을 찾으면 루프를 빠져나올 수 있도록 개선하였다. 많은 실패가 따른 문제다..ㅠㅠ 아직도 실력부족...
#include <iostream> #include <stdlib.h> #define BIG_BAG 5 #define SMALL_BAG 3 using namespace std; int sol(int& n) { int quotient = n/BIG_BAG; while(quotient>=0) { int tmp = n - (BIG_BAG*quotient); if(tmp % SMALL_BAG == 0) return quotient + (tmp/SMALL_BAG); quotient--; } return -1; } int main(void) { int n; //input value(sugar's kg) cin>>n; if(n<3 || n>5000) exit(-1); cout<<sol(n)<<endl; return 0; } |
'Algorithm' 카테고리의 다른 글
[TopCoder 전체탐색] 암호(Cryptography) (0) | 2018.12.20 |
---|---|
[TopCoder 시뮬레이션] 키위주스(KiwiJuiceEasy) (0) | 2018.12.19 |
[BOJ 5543] 상근날드 (0) | 2018.12.18 |
[카카오 2019 신입공채 1차 코딩테스트] 6.매칭 점수 (0) | 2018.11.14 |
[프로그래머스] K번째 수 (0) | 2018.11.14 |