본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 13199 : 치킨 먹고 싶다

by 개발하는 곰돌이 2024. 3. 25.

문제 링크

 

13199번: 치킨 먹고 싶다

서울대학교 301동에는 아는 사람만 아는 “눕치킨”이란 치킨집이 있다. 이 치킨집은 여느 치킨집처럼 치킨을 시킬 때 마다 쿠폰을 C 장 주고, 쿠폰을 F 장 모으면 치킨을 공짜로 시킬 수 있다. 눕

www.acmicpc.net


문제 해설

기본적으로 시킬 수 있는 치킨의 마리수와 치킨을 시키면서 받을 수 있는 쿠폰의 개수는 간단하게 구할 수 있다.

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()
}

댓글