본문 바로가기
알고리즘/백준

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

by ​​​​ 2021. 3. 12.

이름 그대로 단순하게 반복을 돌면서 수열을 진짜로 만든후에 입력된 A부터 B구간을 수열에서 잘라 합을구하면 됩니다

구현하는데는 3가지 방법이 있었습니다

1. 1부터 45까지 더하면 B의 최대범위인 1000을 넘는 1035이기 때문에 반복문을 무조건 45번 돌아서 모든 수열을 만드는 방법

2. 반복문을 돌면서 수열을 만들때마다 수열의 길이를 체크해 B를 넘어가면 종료하는 방법

3. 제너레이터 함수를 만든 후에 itertools에 있는 islice함수를 사용해 원하는 구간만 잘라 더하는방법

만약에 3번으로 푼다면 코드는 이렇게 나오는데

from collections import deque
from itertools import count, islice


def sequence():
    que = deque()
    c = count(1)
    while True:
        n = next(c)
        que.extend([n] * n)
        yield que.popleft()


A, B = map(int, input().split())
sliced=islice(sequence(), A - 1, B)
result = sum(sliced)
print(result)

squence 함수가 제너레이터 함수로, 만약에 for문으로 sequence함수를 출력하려고 하면 for문이 while True을 한것처럼 무한으로 반복되는데

이런 길이가 무한으로 나오는 제너레이터 함수를 리스트처럼 슬라이싱할수 있게해주는 함수가 islice 함수입니다

그래서  sequence를 islice로 잘라준다음 합을 출력하면 끝!