본문 바로가기

Algorithm/Math

(C++) - 백준(BOJ) 1673번 : 치킨쿠폰

반응형

www.acmicpc.net/problem/1673

 

1673번: 치킨 쿠폰

강민이는 치킨 한 마리를 주문할 수 있는 치킨 쿠폰을 n장 가지고 있다. 이 치킨집에서는 치킨을 한 마리 주문할 때마다 도장을 하나씩 찍어 주는데, 도장을 k개 모으면 치킨 쿠폰 한 장으로 교환

www.acmicpc.net

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