백준/브론즈1

[Python] 백준 1292번 - 쉽게 푸는 문제

두부마라탕 2025. 4. 30. 17:00

https://www.acmicpc.net/problem/1292


문제

동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다.

이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다.

하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자.

 

코드

A, B = map(int, input().split())

total = tmp = 0
num = 1

while tmp < B:
    for _ in range(num):
        if tmp >= B:
            break
        total += num
        tmp += 1
    num += 1

tmp = 0
num = 1
while tmp < A - 1:
    for _ in range(num):
        if tmp >= A - 1:
            break
        total -= num
        tmp += 1
    num += 1

print(total)

 

풀이

B까지의 합에서 A-1까지의 합을 빼주는 방식을 이용했다.

1. 숫자 두 개를 받는다.

2. B까지 도달하게 두면서 num을 사용해 계속 수열의 합을 진행한다.

3. tmp가 B보다 커졌다면 for구문을 중단하고 이어 while문도 빠져나온다.

4. 이 과정을 A-1까지 빼주는 걸로 동일하게 진행한다.

 

리스트를 사용한 코드

A, B = map(int, input().split())

total = []
i = 1
while len(total) < B:
    total += [i] * i
    i += 1

print(sum(total[A-1:B]))

 

풀이

사실 처음에 리스트에 싹 다 넣으면 큰 숫자가 나올 때 메모리 사용량이 많아서 시간초과 뜰까봐 안 썼는데... 입력 조건을 다시 보니 숫자가 별로 크지 않아 리스트를 이용한 코드를 짜보았다. 개선된 코드라고 보긴 어렵고... 그냥 메모리 사용량이 적을 때 쓰기 좋은 코드라고 볼 수 있다. 메모리 사용량이 크면 처음의 코드가 적합하다. 가독성이 떨어지지만..

1. 숫자 두 개를 받는다.

2. B까지의 숫자를 리스트에 추가한다.

3. 완성된 리스트에서 주어진 범위만큼의 합을 구해서 출력한다.