반응형
ad-hoc 문제였습니다. 그 뜻처럼 이런 문제에만 적용되는 유일한 해결책을 찾는 문제입니다.
풀이방법
1. 입력
이 문제는 입력의 끝이 규정되어 있지 않습니다. 따라서 loop탈출을 위해서 파일의 끝을 찾았을 때 입력받고 있었던 loop를 탈출해야 합니다. 파일의 끝은 scanf를 사용해서 입력받았을 때 EOF(End Of File)을 만나면 false(0)을 반환합니다.
2. 쿠폰이 남아 있는 동안 loop를 돕니다. loop안에서는 현재 쿠폰 상태, 도장 상태를 저장할 변수를 선언합니다. 그 후 다음과 같은 알고리즘을 따릅니다.
2-1. 정답 변수 ans에 쿠폰 개수를 더합니다. 있으면 모두 치킨으로 바꾼다는 의미입니다.
2-2. 쿠폰을 썼으니 그 만큼 도장이 추가됩니다.
2-3. 쿠폰을 다 치킨으로 바꿨으니 쿠폰 개수는 0이 됩니다.
2-4. 도장이 k개 있으면 1개의 쿠폰으로 바꿀 수 있으므로 쿠폰은 도장개수 / k개 입니다.
2-5. k개의 도장마다 1개의 쿠폰으로 바꿨으니 남은 도장개수는 도장개수 % k개 입니다.
3. 정답을 출력합니다.
Code
#include <bits/stdc++.h>
using namespace std;
int n,k;
int main(){
while(scanf("%d %d",&n,&k)!=EOF){
int ans = 0,coupon = n,stamp = 0;
while(coupon){
ans += coupon;
stamp += coupon;
coupon = 0;
coupon += stamp/k;
stamp %= k;
}
cout << ans <<'\n';
}
}
Test Case
질문게시판에 있었던 몇 가지 반례를 직접 작성해 보았습니다.
input
1 2
답 1
input
답 7 2
13
'Algorithm > Math' 카테고리의 다른 글
(C++) - 백준(BOJ) 1748번 : 수 이어 쓰기 1 (0) | 2021.04.21 |
---|---|
(C++) - 프로그래머스(연습문제) : 최솟값 만들기 (0) | 2021.04.04 |
(C++) - 백준(BOJ) 1002번 : 터렛 (0) | 2021.03.09 |
(C++) - 프로그래머스(연습문제) : 행렬의 곱셈 (0) | 2021.03.06 |
(C++) - 프로그래머스(연습문제) : 최대공약수와 최소공배수 (0) | 2021.03.05 |