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 |