난이도 : 실버 5
알고리즘 유형 : 그리디 알고리즘, 수학, 사칙연산
문제 링크 : https://www.acmicpc.net/problem/28470
문제 풀이과정
문제를 이해함에 있어
공격과 방어를 먼저 할때의 조건을 제시하는 줄에서 볼 수 있는 절대값처럼 생겼지만, 끝자락이 살짝 꺾인 저 기호를 알 필요가 있다.
바닥 함수와 천장 함수 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 수학과 컴퓨터 과학에서 바닥 함수(영어: 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)
'SSAFY 10기 > 백준_파이썬' 카테고리의 다른 글
[백준_파이썬] [🥈5] 28432 (끝말잇기) (0) | 2023.09.01 |
---|---|
[백준_파이썬] [🥈4] 24315 (알고리즘 수업 - 점근적 표기 3) (0) | 2023.08.30 |
[백준_파이썬] [🥈4] 24314 (알고리즘 수업 - 점근적 표기 2) (0) | 2023.08.30 |
[백준_파이썬] [🥈1] 2667번(단지번호붙이기) (0) | 2023.08.29 |
[백준_파이썬] [🥈3] 1072번(게임) (0) | 2023.08.29 |