반응형



나누기, 나머지 연산을 이용하는 문제
머리가 굳어버려 쩔쩔매던 중에 힌트 발견해서 단번에 성공.
(감이 안 잡힐 때에는 저 힌트를 보자.)
문제는 설탕 N kg을 배달하는데, 봉지의 갯수를 최소한으로 해야한다는 것.
결국 5kg 짜리 봉지를 가능한 한 많이 끼워넣고 시작해야한다.
그럼 먼저, N(3 이상)을 5로 나눈 나머지를 구해보자.
3, 4, 0, 1, 2 가 반복된다.
그렇다는 얘기는 N%5의 결과에 따라 경우가 나뉜다는 뜻.
경우에 따라 구분하여, 각각의 규칙을 찾아본다.
if (N%5 == 3):
5로 나눴을 때의 나머지가 3인 숫자는
3, 8, 13, 18, 23, ...
3을 제외하고 8부터는 5x + 3의 꼴이다.
if (N%5 == 4):
4, 9, 14, 19, 24, ...
4는 3과 5로 나타낼 수 없다.
9는 3*3
14부터는 5x + 9 의 형태가 계속된다.
if (N%5 == 0):
5, 10, 15, 20, 25, ...
5개짜리로 모두 배달 가능함이 자명하다.
if (N%5 == 1):
6, 11, 16, 21, 26, ...
6은 3*2
11부터는 5x + 6 의 형태가 계속된다.
if (N%5 == 2):
7, 12, 17, 22, 27, ...
7 또한 3과 5로 표현 불가능.
12는 3*4
17부터는 5x + 12
#include <iostream> using namespace std; int HowManyBags(int n) { int remainder(n % 5); switch (remainder) { case 3: cout << (n / 5 + 1) << endl; break; case 4: if (n / 5 == 0) cout << -1 << endl; if (n / 5 == 1) cout << 3 << endl; if (n / 5 > 1) cout << (n / 5 - 1) + 3 << endl; break; case 0: cout << n / 5 << endl; break; case 1: cout << (n / 5 - 1) + 2 << endl; break; case 2: if (n / 5 == 1) cout << -1 << endl; if (n / 5 == 2) cout << 4 << endl; if (n / 5 > 2) cout << (n / 5 - 2) + 4 << endl; break; } return 0; } int main() { int N; cin >> N; HowManyBags(N); }
반응형
'Devlog > Coding Practice' 카테고리의 다른 글
[C++] 11720 숫자의 합 (0) | 2020.07.20 |
---|---|
[C++] 2439 별 찍기 - 2 (0) | 2020.07.20 |
[C++] 15552 빠른 A+B (0) | 2020.07.20 |
[C++] 2741 N 찍기 (0) | 2020.07.18 |
[C++] 1008번 A/B (2) | 2020.07.18 |