
문제
https://softeer.ai/practice/6292
Softeer - 현대자동차그룹 SW인재확보플랫폼
수퍼바이러스가 숙주의 몸속에서 0.1초당 P배씩 증가한다. 처음에 수퍼바이러스 K마리가 있었다면 N초 후에는 총 몇 마리의 수퍼바이러스로 불어날까? N초 동안 죽는 수퍼바이러스는 없다고 가정
softeer.ai

해설
https://vehiclewithai.tistory.com/4
Softeer 연습문제 [파이썬] #1. A+B 해설
문제 제약조건 두 정수 A와 B는 1이상 9이하의 정수이다. 입력형식 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. 출력형
vehiclewithai.tistory.com
(우선 입력값을 받아들이는 기초적인 부분에 대한 내용은 위에 있으니 참고해주시면 감사하겠습니다!)
처음에는 입력값을 받아들이고, 그 입력값을 토대로 계산만 해주면 되는 문제로 알았다.
그래서 처음에 K마리가 있고,
슈퍼바이러스가 0.1초당 P배씩 증가하기 때문에 K에다가 0.1초마다 P를 한번씩 곱해주는 연산을 진행하면 되고, 마지막에 1000000007로 나눈 나머지(%)를 구해주면 된다고 생각을 했는데,
import sys
# 입력값 받기
K, P, N = map(int, sys.stdin.readline().split())
# 계산해주기 (pow: 제곱해주는 함수, %: 나눗셈의 나머지 구해주는 연산자)
print(K*pow(P, N*10)%1000000007)

그렇게 푸니 2초가 초과해서 오답이 되는 경우가 생겨서 이 문제를 통과하지 못했다.
알고보니 단순 계산이 아니라 효율을 높이기 위해 "지수
재귀함수"라는 알고리즘을 사용해야만 했던 것이었다.

즉 제곱항의 계산을 재귀적으로 표현해주게 되면 그 연산량이 줄어들기 때문에 2초 안에 풀 수가 있게 된다. (고 하는데,,, 왜 여전히 오답이 뜨는지 모르겠다.)
코드
import sys
def power(num, power_term):
if power_term==1:
return num%1000000007
if (power_term%2 == 0):
sub1 = power(num, power_term/2)
return sub1*sub1%1000000007
else:
sub2 = power(num, (power_term-1)/2)
return num*sub2*sub2%1000000007
# 입력값 받기
K, P, N = map(int, sys.stdin.readline().split())
# 계산해주기 (pow: 제곱해주는 함수, %: 나눗셈의 나머지 구해주는 연산자)
print(K*power(P, N*10)%1000000007)
결과

'알고리즘 > 소프티어' 카테고리의 다른 글
[파이썬] Softeer 연습문제 #6. 우물 안 개구리 완벽해설 (2) | 2023.12.08 |
---|---|
[파이썬] Softeer 연습문제 #5. 강의실 배정 완벽해설 (1) | 2023.12.07 |
[파이썬] Softeer 연습문제 #3. 징검다리 (Lv. 3) 완벽해설 (1) | 2023.11.25 |
[파이썬] Softeer 연습문제 #2. 성적 평균 (Lv. 3) 완벽해설 (0) | 2023.11.25 |
[파이썬] Softeer 연습문제 #1. A+B (Lv. 1) 완벽해설 (2) | 2023.11.25 |