본문 바로가기

알고리즘/소프티어

[파이썬] Softeer 연습문제 #17. H-클린알파 완벽해설

문제

 

https://softeer.ai/practice/6278

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

나날이 심해지는 미세먼지로 인해 야외뿐만 아니라 집 안에서도 마음 놓을 수 없는 날이 계속되고 있다. 유해 물질이 창문 틈새로 새어 들어오거나, 외출 후 옷과 신발 등에 붙어 들어와 집 안이

softeer.ai

 

 

 

해설

 

이 문제 또한 한가지 규칙을 잘 파악하면 풀 수 있는 문제이다.

 

 

 

즉 1초일 때 일정 갯수의 바이러스가 더해지고, 그 다음 시간부터는 이전 1초의 바이러스가 P만큼 증식하고나서 일정 갯수의 바이러스가 다시 더해진다. 그렇게 N만큼의 시간동안 진행이 되는 규칙을 가진다.

 

for i in range(N):
  if (i>=1):
    num_virus *= P
  num_virus += viruses[i]
  num_virus = num_virus % 1000000007

 

이를 코드로 작성하면 위와 같다. 매 초마다 바이러스가 침입할 때, 그 바이러스를 더해준다. 그 다음 루프를 돌릴 때면 1초가 지났다는 의미이기 때문에 P만큼을 바이러스를 더하기 전에 곱해준다. 

 

그리고 여기서 "1000000007"로 나눈 나머지를 출력하라고 주어졌기 때문에 매번 바이러스의 값을 계산할 때마다 1000000007의 나머지를 저장해준다. 이렇게 계산해도 "모듈러 산술 원리"에 의해서 결과값은 동일해진다.

 

https://vehiclewithai.tistory.com/18

 

[파이썬] Softeer 연습문제 #12. 바이러스 완벽해설

문제 바이러스가 숙주의 몸속에서 1초당 P배씩 증가한다. 처음에 바이러스 K마리가 있었다면 N초 후에는 총 몇 마리의 바이러스로 불어날까? N초 동안 죽는 바이러스는 없다고 가정한다. 제약조

vehiclewithai.tistory.com

모듈러 산술에 대한 설명은 위에 나와있다.

 

따라서 바이러스의 값을 구할 때마다 1000000007을 나눈 나머지로 저장을 해주어야만 한다. 그렇지 않으면 이 문제의 경우 256MB 메모리 초과가 일어나기 쉽다.

 

 

코드

 

import sys

P, N = map(int, sys.stdin.readline().split())
viruses = list(map(int, sys.stdin.readline().split()))
num_virus = 0

for i in range(N):
  if (i>=1):
    num_virus *= P
  num_virus += viruses[i]
  num_virus = num_virus % 1000000007

print(num_virus)

 

 

결과