[백준/파이썬] 17950번 풀이

업데이트:



문제 정보


풀이

문제

오늘도 과제산에서는 크고 작은 스노우볼들이 굴러가고 있다. 과제산 아래에서 살고 있는 정명이는 이 스노우볼이 너무 커져서 집을 무너뜨릴까 걱정이다. 시작은 아무리 작은 스노우볼이라도, 내려오면서 엄청나게 커지기 때문에 스노우볼에 대한 대비책이 필요했다. 정명이는 스노우볼들이 산에서 모두 굴러내려왔을 때 총량이 어느 정도일지 계산해보려고 한다. 스노우볼은 다음과 같은 규칙으로 성장한다.

  • 과제산의 높이는 H cm이다.

  • 스노우볼은 해발고도 1cm 이상에서만 만들어지고, 처음 만들어진 크기는 1이다.

  • 만들어진 스노우볼은 1cm 내려올 때마다 이전 크기의 x배가 된다.

스노우볼의 개수가 적었다면 정명이가 직접 계산할 수 있었겠지만, 오늘은 어째서인지 스노우볼이 너무 많이 내려오고 있다. 여러분이 정명이를 도와주자!

입력 요약
첫 번째 줄에 과제산의 높이 H, 스노우볼이 커지는 정도 x가 정수로 주어진다. (1 ≤ H ≤ 106, 1 ≤ x ≤ 100)

두번째 줄부터 H줄 동안 과제산에서 만들어진 스노우볼의 개수가 정수로 주어진다. i+1번째 줄의 수가 높이 i cm에서 만들어진 스노우볼의 개수 ci를 의미한다. (0 ≤ ci ≤ 100)

출력 요약
과제산에서 모든 스노우볼이 내려왔을 때의 크기 합을 출력하라. 단 답이 너무 커질 수 있으니 109 + 7로 나눈 나머지를 출력하라.

코드

import sys;read=sys.stdin.readline
h,x=map(int,read().split())
s=0
a=x
for i in range(h):
    s=(s+int(read())*a)%1000000007
    a=(a*x)%1000000007
print(s)

설명

핵심은 구현 관점에서 오늘도 과제산에서는 크고 작은 스노우볼들이 굴러가고 있다. 과제산 아래에서 살고 있는 정명이는 이 스노우볼이 너무 커져서 집을 무너뜨릴까 걱정이다. 시작은 아무리 작은 스노우볼이라도, 내려오면서 엄청나게 커지기 때문에 스노우볼에 대한 대비책이 필요했다. …를 만족하도록 로직을 구성하는 것입니다.

코드는 입력을 파싱한 뒤 조건 분기와 계산을 순서대로 수행하고, 문제에서 요구한 형식으로 결과를 출력합니다.

경계값과 예외 케이스도 함께 고려해 오답이 나기 쉬운 상황을 방지합니다.



이런 주제는 어떠신가요?

비슷한 난이도와 유형의 문제를 이어서 보면 풀이 감각을 더 빠르게 잡기 좋습니다.

댓글남기기