본문 바로가기
SSAFY 10기/백준_파이썬

[백준_파이썬] [🥈5] 28470번(슥~빡! 빡~슥!)

by 우물왕 2023. 8. 26.

난이도 : 실버 5

알고리즘 유형 : 그리디 알고리즘, 수학, 사칙연산

문제 링크 : https://www.acmicpc.net/problem/28470

 

문제 풀이과정

문제를 이해함에 있어

공격과 방어를 먼저 할때의 조건을 제시하는 줄에서 볼 수 있는 절대값처럼 생겼지만, 끝자락이 살짝 꺾인 저 기호를 알 필요가 있다.

https://ko.wikipedia.org/wiki/%EB%B0%94%EB%8B%A5_%ED%95%A8%EC%88%98%EC%99%80_%EC%B2%9C%EC%9E%A5_%ED%95%A8%EC%88%98

 

바닥 함수와 천장 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 수학과 컴퓨터 과학에서 바닥 함수(영어: floor function)는 각 실수 이하의 최대 정수를 구하는 함수이다. 천장 함수(天障函數, 영어: ceiling function)는 각 실수 이상

ko.wikipedia.org

그것은 바닥함수이다. 바닥함수는 제시된 실수 이하의 정수를 나타내며, 쉽게 생각하면 내림계산이라고 보면 된다. 

그 반대로 윗자락이 살짝 꺾인 기호는 천장함수이다. 제시된 실수 이상의 정수를 의미하며, 올림이라고 보면 된다.

즉 아드레날린 계수(실수)를 공격/회피 시 아드레날린에 곱할 때, 이 문제에서는 math 모듈을 사용하여 floor 내장함수를 사용하면 된다. 

 

SSAFY 수업에서 보았었던 기억이 나서, 문제로 접한김에 다시 한번 검색해 보았다. 

 

또한 이 문제에서 예제만을 보고, 단순히 계수를 공격에 곱하면 최대의 결과가 나올 것이라 생각할 수 있지만, 문제 조건에서 0<K<=1000의 범위를 주므로, 1미만의 계수가 주어질때는 계수를 공격에 곱하지 말고, 회피에 곱하면 결과적으로 최대값을 구할 수 있다. 

반응형

코드

 

from math import floor

T = int(input()) # 공격 횟수
A_list = list(map(int, input().split())) # 공격시 아드레날린
D_list = list(map(int, input().split())) # 회피시 아드레날린
Ad_param = list(map(float, input().split())) # 각 공격시 아드레날린 추가 계수
new_ad = [0] * T
for i in range(T):
    new_ad[i] = Ad_param[i] * 10 # 부동소수 오류 방지 목적으로 소수 * 정수 연산 대신 정수 * 정수 연산
res = 0
for i in range(T):
    if Ad_param[i] >= 1: #아드레날린 계수 1이상 = 공격에 곱하여 아드레날린을 올린다.
        res += floor(A_list[i] * new_ad[i] / 10)  #문제에서 floor 올림 할것을 제시하였음.
        res -= D_list[i]
    else: #아드레날린 계수 1미만 = 회피에 곱하여 아드레날린이 떨어지는 것을 줄인다.
        res += A_list[i] 
        res -= floor(D_list[i] * new_ad[i] / 10)

print(res)

 

 

 


 

 

반응형