문제풀이/구현

[Python/파이썬] 백준 11387번 님 무기가 좀 나쁘시네여

딜레이레이 2025. 4. 15. 12:30

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까지이므로 오버플로우는 걱정 안해도 된다.