문제 링크
문제 해설
문제 자체는 단순한 구현 문제지만 주의할 점이 있다. 전투력을 계산할 때 실수 계산을 많이 하게 되는데 컴퓨터는 내부적으로 모든 수를 2진법으로 저장하기 때문에 소수점 이하 부분은 정확하게 저장할 수 없고 근사치를 저장하게 된다. 이 과정에서 여러번의 연산을 하다보니 오차가 발생하여 식은 맞지만 답은 틀리는 경우가 발생할 수 있다. 따라서 BigDecimal을 사용하여 오차 없이 계산해야 한다. 이점만 주의하면 크리와 파부의 기존 전투력과 무기를 바꿨을 때의 전투력을 비교하여 결과를 출력하면 된다.
Code
import java.math.BigDecimal
import java.util.StringTokenizer
fun main() = with(System.`in`.bufferedReader()) {
val players = Array(2) {
readLine().let {
StringTokenizer(it).run {
Player(
BigDecimal(nextToken()),
BigDecimal(nextToken()),
BigDecimal(nextToken()).divide(100.toBigDecimal()),
BigDecimal(nextToken()).divide(100.toBigDecimal()),
BigDecimal(nextToken()).divide(100.toBigDecimal())
)
}
}
}
val weapons = Array(2) {
readLine().let {
StringTokenizer(it).run {
Player(
BigDecimal(nextToken()),
BigDecimal(nextToken()),
BigDecimal(nextToken()).divide(100.toBigDecimal()),
BigDecimal(nextToken()).divide(100.toBigDecimal()),
BigDecimal(nextToken()).divide(100.toBigDecimal()))
}
}
}
println(
if ((players[0] - weapons[0] + weapons[1]).power > players[0].power) '+'
else if ((players[0] - weapons[0] + weapons[1]).power < players[0].power) '-'
else '0'
)
println(
if ((players[1] - weapons[1] + weapons[0]).power > players[1].power) '+'
else if ((players[1] - weapons[1] + weapons[0]).power < players[1].power) '-'
else '0'
)
}
class Player(var attack: BigDecimal,
var strength: BigDecimal,
var critical: BigDecimal,
var criticalDamage: BigDecimal,
var attackSpeed: BigDecimal) {
val power
get() = attack *
(1.toBigDecimal() + strength.divide(100.toBigDecimal())) *
((1.toBigDecimal() - minOf(BigDecimal(1), critical)) + minOf(BigDecimal(1), critical) * criticalDamage) *
(1.toBigDecimal() + attackSpeed)
operator fun plus(other: Player) = Player(
this.attack + other.attack,
this.strength + other.strength,
this.critical + other.critical,
this.criticalDamage + other.criticalDamage,
this.attackSpeed + other.attackSpeed)
operator fun minus(other: Player) = Player(
this.attack - other.attack,
this.strength - other.strength,
this.critical - other.critical,
this.criticalDamage - other.criticalDamage,
this.attackSpeed - other.attackSpeed)
}
'Algorithm > BOJ' 카테고리의 다른 글
[Kotlin] 백준 1806 : 부분합 (0) | 2022.12.17 |
---|---|
[Kotlin] 백준 25916 : 싫은데요 (0) | 2022.12.16 |
[Kotlin] 백준 12785 : 토쟁이의 등굣길 (0) | 2022.12.14 |
[Kotlin] 백준 26215 : 눈 치우기 (0) | 2022.12.12 |
[Kotlin] 백준 15595 : 정답 비율 계산하기 (0) | 2022.12.10 |
댓글