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. 완성된 리스트에서 주어진 범위만큼의 합을 구해서 출력한다.
'백준 > 브론즈1' 카테고리의 다른 글
| [Python] 백준 1373번 - 2진수 8진수 (0) | 2025.05.03 |
|---|---|
| [Python] 백준 1236번 - 성 지키기 (0) | 2025.04.30 |
| [Python] 백준 1157번 - 단어 공부 (0) | 2025.04.29 |
| [Python] 백준 2755번 - 이번학기 평점은 몇 점? (0) | 2025.04.29 |
| [Python] 백준 1037번 - 약수 (0) | 2025.04.28 |