◼ PS Note/백준

[백준] 1292번 : 쉽게 푸는 문제 (🥈실버 5) (Python)

SangYoonLee (SYL) 2023. 1. 22. 04:13
반응형

문제 바로 가기

 

1292번: 쉽게 푸는 문제

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

www.acmicpc.net

 


풀이 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 힘수를 통해 구한다.

 

느낀 점

  • 범위가 크지 않다면, 메모리를 잡아먹더라도 이렇게 수열의 값을 일일히 다 저장해서 원하는 구간만 잘라 보는 방법도 유용하겠구나..

 

반응형