콜라 문제
정답은 아무에게도 말하지 마세요. 콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가? 단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.
콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 1병을 또 받을 수 있습니다.
이 경우 상빈이는 총 10 + 5 + 2 + 1 + 1 = 19병의 콜라를 받을 수 있습니다.
콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.
알고리즘
모듈러 연산
풀이
@Nested
class TestCases {
@Test
public void case1 () {
int a = 2; // 가져다 주는 빈 병 수
int b = 1; // 빈 병을 가져다 주면 주는 콜라 수
int n = 20; // 빈 병
int expected = 19;
Assertions.assertEquals(expected, solution(a, b, n));
}
@Test
public void case2 () {
int a = 3; // 가져다 주는 빈 병 수
int b = 1; // 빈 병을 가져다 주면 주는 콜라 수
int n = 20; // 빈 병
int expected = 9;
Assertions.assertEquals(expected, solution(a, b, n));
}
public int solution( int a, int b, int n ) {
int answer = 0;
int coke = n;
while( true ) {
if( coke < a ) break;
int remain = coke % a;
int replace = (coke / a) * b;
answer += replace;
coke = remain + replace;
}
return answer;
}
}