https://www.acmicpc.net/problem/11387
코드
def combat_power(info):
attack, power, critical, critical_damage, speed = info
result = attack
result *= (100 + power)
result *= (100*(100 - min(100, critical)) +
min(100, critical)*critical_damage)
result *= (100 + speed)
return result
infos = [list(map(int, input().split())) for _ in range(4)]
now_cri = combat_power(infos[0])
now_paboo = combat_power(infos[1])
# 크리가 파부 무기를 장착했을 때
new_info = []
for i in range(5):
new_info.append(infos[0][i]-infos[2][i]+infos[3][i])
new_cp = combat_power(new_info)
if new_cp > now_cri:
print("+")
elif new_cp == now_cri:
print("0")
else:
print("-")
# 파부가 크리 무기를 장착했을 때
new_info = []
for i in range(5):
new_info.append(infos[1][i]-infos[3][i]+infos[2][i])
new_cp = combat_power(new_info)
if new_cp > now_paboo:
print("+")
elif new_cp == now_paboo:
print("0")
else:
print("-")
문제의 풀이 방법 자체는 안 어려운데, 부동소수점을 조심해야 한다.
컴퓨터는 숫자를 2진수로 저장하는데, 소수는 저장할 수 있는 자릿수를 넘는 경우가 있을수도 있다(ex.무한소수). 이런 경우에는 정확한 소수를 저장하지 못하고 근사치를 저장하게 되기 때문에 소수를 이용하여 비교 연산을 하면 예상한 답과 다르게 나올 수 있다.
그렇기에 컴퓨터에서 연산을 할 때는 웬만하면 정수로 해야한다. 그래서 여기서는 100을 곱해서 퍼센트를 모두 정수로 바꿔서 연산하는 방법을 사용했다.
이때, 결국 전투력 계산식의 양변에 100^3을 곱하는 것이므로 c언어 같이 정수의 범위를 나눠서 int, long 등으로 쓰는 언어는 오버플로우 유의해야할 것 같다. Python3는 정수를 여러 타입으로 나누지 않고 있고, 정수로 표현할 수 있는 범위가 2^30까지이므로 오버플로우는 걱정 안해도 된다.
'문제풀이 > 구현' 카테고리의 다른 글
[Javascript/자바스크립트] (프로그래머스) 베스트앨범 (0) | 2025.05.08 |
---|---|
[Python/파이썬] 백준 9555번 대회 장소 준비 (0) | 2025.04.22 |
[Python/파이썬] 백준 11067번 모노톤길 (0) | 2025.04.12 |
[Python/파이썬] 백준 15905번 스텔라(STELLA)가 치킨을 선물했어요 (0) | 2025.04.03 |
[Python/파이썬] LeetCode 916번 Word Subsets (0) | 2025.03.27 |