문제 링크
문제 해설
기본적으로 시킬 수 있는 치킨의 마리수와 치킨을 시키면서 받을 수 있는 쿠폰의 개수는 간단하게 구할 수 있다.
val chicken = money / price
val coupon = chicken * c
이제 두영이의 경우와 상언이의 경우를 나눠서 생각해보자.
두영이의 경우는 쿠폰으로 시키는 치킨에 쿠폰이 나오지 않는다. 따라서 기본 치킨 마리수에 쿠폰의 개수를 \(f\)로 나눈 값을 그냥 더해주기만 하면 된다.
val dooyoung = chicken + coupon / f
상언이의 경우는 조금 생각할 점이 있다.
상언이는 쿠폰으로 주문했을 때도 \(c\)장의 쿠폰을 받는다. 달리 생각하면 상언이는 쿠폰 \(f-c\)개로 공짜 치킨을 시킬 수 있는 셈이다.
\(f=5, c=1\)인 상황에서 치킨을 4마리만 시킬 수 있는 경우를 생각해보자.
이 경우 쿠폰은 4장밖에 없어서 쿠폰으로 치킨을 시킬 수 없는 상황이지만 위 공식대로라면 \(f-c=4\)이기 때문에 쿠폰으로 치킨을 시킬 수 있다고 판별하게 된다.
이를 방지하기 위해 쿠폰 수가 \(f\) 이상일 경우에만 처음 공짜로 시키는 치킨 한마리만 별도로 빼주고 남은 쿠폰들을 \(f-c\)로 나눠주면 된다.
val sangun = chicken + if (coupon >= f) 1 + (coupon - f) / (f - c) else 0
상언이의 경우와 두영이의 경우를 모두 구했으니 각 테스트 케이스별로 상언이의 치킨 수에서 두영이의 치킨 수를 뺀 값을 출력하면 끝!
Code
import java.util.StringTokenizer
fun main() = with(System.`in`.bufferedReader()) {
val bw = System.out.bufferedWriter()
repeat(readLine().toInt()) {
StringTokenizer(readLine()).apply {
val (price, money, f, c) = IntArray(4) { nextToken().toInt() }
val chicken = money / price
val coupon = chicken * c
val dooyoung = chicken + coupon / f
var sangun = chicken
if (coupon >= f) {
sangun += 1 + (coupon - f) / (f - c)
}
bw.write("${sangun - dooyoung}")
bw.newLine()
}
}
bw.close()
}
'Algorithm > BOJ' 카테고리의 다른 글
[Kotlin] 백준 23031 : 으어어… 에이쁠 주세요.. (0) | 2024.05.02 |
---|---|
[Kotlin] 백준 25418 : 정수 a를 k로 만들기 (0) | 2024.04.29 |
[Kotlin] 백준 3107 : IPv6 (0) | 2024.02.20 |
[Kotlin] 백준 25240 : 가희와 파일 탐색기 2 (0) | 2023.12.30 |
[Kotlin] 백준 11082 : 소수를 분수로 (0) | 2023.12.11 |
댓글