본문 바로가기

백준

5032)탄산 음료

https://www.acmicpc.net/problem/5032


쉬워보이는 문제지만 쉽지 않다.


예제 입력이 9 0 3이고 예제 출력이 4이다.


총 빈 음료병의 갯수가 9개여서 새 음료수 3개와 교환했다.


그리고 그 음료수를 마셔 빈 음료병 3개가 생겨 새 음료수 하나를 더 교환한 것이다.


빈 음료병을 교환해 생긴 음료수도 빈 음료병 갯수로 고려해야 한다.


이를 위해 4개의 변수를 사용하자.


e는 빈 음료병의 갯수, drink는 교환한 총 음료수의 갯수, change는 교환 받은 빈 음료수의 갯수, unchange는 교환 받지 못한 빈 음료수의 갯수다. 


빈 병의 갯수가 21개 이고 3개의 빈 병으로 새 음료수와 교환할 수 있을 때, 몇 개의 새 음료수와 교환할 수 있을까?


위 그림은 새 음료수 병을 구하기 위해 변수들이 어떻게 상호작용하는 지 보여준다.


처음엔 빈 병 21개가 있는데 7개의 새 음료수로 교환 가능하다.


3으로 나누었을 때 나머지는 새 음료수로 교환하기엔 모자란 빈 병들의 갯수이지만


새 음료수가 곧 빈 병이 되기 때문에 나중에 필요하다.


교환 받은만큼의 새 음료수는 drink에 합산한다.

두 번째로 동작할 때 변수의 상태는 위 그림과 같다.


빈 병의 갯수는 이전에 교환한 새 음료수의 갯수와 교환하지 못한 빈 병의 갯수의 합이다.


그 합은 7인데 다시 교환해 얻을 수 있는 새 음료수 갯수와 교환할 수 없는 빈 병 갯수를 저장한다.


drink엔 교환받은 새 음료수 갯수만큼 더 해준다.

세 번째도 같은 방식으로 동작한다.


처음엔 경계 조건을 e가 0이되면 반복을 빠져나오게 했는데 이렇게 하면 무한 루프를 돌게 된다.


e가 0,1,2(3으로 나눈 나머지) 중 하나의 값을 갖기 때문이다.


그래서 e가 c(새 음료수로 바꿀 수 있는 빈 병의 갯수)이상일 때 루프를 돌게해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
 
int main() {
    int e, f, c;
    int drink = 0;
    int change = 0;
    int unchange = 0;
 
    scanf("%d %d %d",&e,&f,&c);
 
    e += f;
    while (e>=c) {
        change = e / c; unchange = e % c;
        drink += change;
        e = change + unchange;
    }
    printf("%d\n",drink);
 
    system("pause");
    return 0;
}
cs

 


'백준' 카테고리의 다른 글

1912)연속합  (0) 2019.02.04
2804)크로스워드 만들기  (0) 2019.02.03
1026)보물  (0) 2019.02.03
2108)통계학  (0) 2019.02.02
2563)색종이  (0) 2019.02.02