[백준/파이썬] 1292번 쉽게 푸는 문제 풀이

업데이트:



문제 정보


풀이

문제

수열 1, 2, 2, 3, 3, 3, ...에서 구간 [A, B]의 합을 구하는 문제입니다.

코드

import math
a,b=map(int, input().split())
x=math.ceil(((1+8*a)**.5-1)/2)
y=math.ceil(((1+8*b)**.5-1)/2)
if x==y:print((b-a+1)*x)
else:    
    s=x*(x*(x+1)//2-a+1)
    for i in range(x+1,y): s+=i*i
    s+=y*(b-y*(y-1)//2)
    print(s)

설명

삼각수로 인덱스가 어느 숫자 구간에 속하는지 찾습니다.

  • x: 시작 인덱스 A가 속한 값
  • y: 끝 인덱스 B가 속한 값

x == y면 같은 블록 안이므로 바로 계산하고, 다르면 시작 블록 일부 + 중간 전체 블록 + 끝 블록 일부를 더해 합을 구합니다.



댓글남기기