1. 문제 상세
https://www.acmicpc.net/problem/2839
2. 문제 접근
모든 경우의 수를 확인하는 브루트 포스 알고리즘을 사용하여 문제를 해결해보자.
입력받은 무게를 5로 나누었을때 나머지가 0이면 5로 나눈 몫을 무게에서는 빼주고 봉지 수에는 더한다.
위의 경우 봉지 수가 최소 갯수로 계산이 끝난 것이므로 반복을 끝내도록 하자.
입력받은 무게에서 3을 빼고 봉지 수를 하나 추가한다.
나머지가 0이 아니라면 3을 빼고 봉지 수를 하나 추가하는 과정을 반복한다.
반복은 무게가 0보다 작거나 같아질 때 까지 반복하자.
반복이 끝나면 무게가 0보다 작은지 확인, 0이라면 봉지 개수를 출력하고 0보다 작으면 -1을 출력하자.
3. 문제 풀이
#include <iostream>
using namespace std;
int main() {
int n, bag = 0;
cin >> n;
while (n > 0) {
if (n % 5 == 0) {
bag += n / 5;
break;
}
n -= 3;
bag++;
}
if (n < 0) cout << -1;
else cout << bag;
}
정수형 변수 n, bag 을 선언하고 bag 을 0으로 초기화한다. // bag 변수로 봉지 수를 카운트하자.
cin 으로 무게를 입력받아 n 에 저장한다.
while문으로 n 이 0보다 클 때 반복한다. // 무게를 빼고 봉지 수를 늘리며 확인하기 때문에 무게가 0보다 클 때 반복하도록 한다.
반복에서는 if문으로 n 을 5로 나눈 값이 0이라면 bag 에 n 을 5로 나눈 몫을 더하고 break 로 반복을 빠져나간다.
// 현재무게가 5의 배수, 즉 5키로 봉투로 모두 들 때 최소 갯수이므로, 봉투 개수를 계산하고, 반복을 나간다.
아니라면 n 에서 3을 빼주고 bag 에 1을 더한다.
/* 남은 무게가 5로 나누어떨어지지 않으므로 3키로 봉투를 들어야 하기 때문에 빼고 봉투 개수에 1을 더한다.
만약 여기서 남은 무게가 0이 되면 딱 맞게 무게를 계산한 것이므로 봉투를 들어서 bag 을 출력할 것이고,
남은 무게가 0보다 작아지면 무게가 주어진 봉투로는 계산되지 않는 것이므로 -1을 출력할 것이다. */
반복이 끝나면 if문으로 n 이 0보다 작으면 cout 으로 -1 을 출력, 아니라면 bag 을 출력한다. // 위에서 설명한대로이다.
4. 성능 확인
5. 마무리
.
'백준 - 단계별로 풀어보기 > 브루트 포스' 카테고리의 다른 글
[백준] 1436번 : 영화감독 숌 | C++ (0) | 2023.11.01 |
---|---|
[백준] 1018번 : 체스판 다시 칠하기 | C++ (0) | 2023.11.01 |
[백준] 19532번 : 수학은 비대면강의입니다 | C++ (1) | 2023.10.31 |
[백준] 2231번 : 분해합 | C++ (0) | 2023.10.31 |
[백준] 2798번 : 블랙잭 | C++ (0) | 2023.10.31 |