반응형
문제 바로 가기
풀이 1
- 사용 언어 : Python
- 풀이한 날짜 : 2022-03-05
a, b = tuple(map(int, input().split()))
cnt = 0; ans = 0
def count():
global cnt, ans
for i in range(1, 1001):
for j in range(1, i+1):
cnt += 1
if a <= cnt and cnt <= b:
ans += i
if cnt > b:
return
count()
print(ans)
풀이 로직
- 수열의 k 번째 위치의 값이 무엇인지 바로 알 수 있으면, 구간의 합 또한 쉽게 구할 수 있다.
- 즉, '수열의 k 번째 위치에 해당하는 값 n'에서 k가 주어졌을 때 n을 바로 구할 수 있는 코드를 짜는 것이 핵심하다.
(이 k와 n의 관계는 일대일 함수 f(k) = n로도 나타낼 수 있다.) - 이를 위해 2중 for문의 성질을 활용한다.
cnt = 0
for i in range(1, n):
for j in range(1, i+1):
cnt += 1
- 다음의 코드에서 내부 변수 i, j와 전역 변수 cnt의 값이 어떻게 달라지는지 디버깅을 해보자.
i | j | cnt |
1 | 1 | 1 |
2 | 1 | 2 |
2 | 2 | 3 |
3 | 1 | 4 |
3 | 2 | 5 |
3 | 3 | 6 |
4 | 1 | 7 |
4 | 2 | 8 |
4 | 3 | 9 |
- 여기서 i는 f(k) = n의 n, cnt는 f(k) = n의 k와 동일한 값을 갇는다.
- 이를 통해, 수열의 첫 번째 숫자부터 차례대로 탐색하면서 a번째 숫자부터 b번째 숫자까지 각각의 값을 구하고, 이들을 모두 더해주면 원하는 답을 얻을 수 있다.
문제 접근 과정 및 느낀점
- 우선, 이 문제는 '수열의 k 번째 위치에 해당하는 값 n'에서 f(k) = n을 만족하는 일대일 함수를 어떻게 코드로 구현할 지 파악하는 것이 관건이라 생각했다.
- 수학적 지식을 이용해 n, k의 관계는 2k = n(n+1)임을 알았으나, 이 식으론 k를 통해 n을 한 번에 도출하기가 어려웠다.
- 이 때, 어렴풋한 과거 문제풀이의 경험에서 2중 for문을 사용하면 되겠다는 생각이 떠올랐고, 이를 코드로 구현하여 답을 구할 수 있었다.
- 과거 문제 풀이 경험이 실제로 이렇게 도움이 된다는 것을 체험하면서, 문제를 많이 풀어보며 경험을 쌓는 것이 중요하다는 사실을 다시 한 번 상기할 수 있었다.
- 더불어, PS에 수학적 사고가 중요하다는 점 또한 다시 짚어볼 수 있었다.
풀이 2 (Python) (모범 답안 참고)
- 사용 언어 : Python
- 풀이한 날짜 : 2022-03-05
a,b = map(int, input().split())
arr = [0]
for i in range(46):
for j in range(i):
arr.append(i)
print(sum(arr[a:b+1]))
풀이 로직
- 문제의 수열을 2중 for문으로 직접 만들어서, 주어진 구간의 합을 리스트 슬리이싱과 sum 힘수를 통해 구한다.
느낀 점
- 범위가 크지 않다면, 메모리를 잡아먹더라도 이렇게 수열의 값을 일일히 다 저장해서 원하는 구간만 잘라 보는 방법도 유용하겠구나..
반응형
'◼ PS Note > 백준' 카테고리의 다른 글
[백준] 1929번 : 소수 구하기 (🥈실버 3) (0) | 2023.01.22 |
---|---|
[백준] 1037번 : 약수 (🥈실버 5) (Python) (0) | 2023.01.22 |
[백준] 1026번 : 보물 (🥈실버 4) (Python) (0) | 2023.01.22 |
[백준] 1652번 : 누울 자리를 찾아라 (🥉브론즈 1) (JavaScript) (0) | 2023.01.21 |
[백준] 25304번 : 영수증 (🥉브론즈 5) (JavaScript) (2) | 2023.01.21 |