SangYoonLee (SYL)
◆ Slow, But Steady ◆
SangYoonLee (SYL)
전체 방문자
오늘
어제
  • ◻ 전체 글 수 : (128)
    • ✪ 취미, 경험 회고 및 일상 (25)
      • [취미] Room Escape (2)
      • [회고] IT 관련 경험 회고 (17)
      • [일상] 일상 생각 (4)
      • [일상] 독후감 (1)
    • ◼ FrontEnd (27)
      • Web & HTML, CSS (8)
      • JavaScript (2)
      • TypeScript (1)
      • ReactJS (16)
    • ◼ CS (3)
      • 자료구조 & 알고리즘 (1)
      • 컴퓨터 구조 (1)
      • 운영체제 (1)
    • ◼ PS Note (40)
      • 백준 (38)
      • 프로그래머스 (2)
    • ◼ IT Etc. (33)
      • (Until 2021) (21)
      • Python (6)
      • C | C# | C++ (1)
      • Git (1)
      • Unity (4)
      • Game Dev. (0)

블로그 메뉴

  • 홈
  • 💻 GitHub
  • 🟢 Velog
  • 🧩 온라인 방탈출 출시 작품 모음

인기 글

최근 글

공지사항

반응형
hELLO · Designed By 정상우.
SangYoonLee (SYL)

◆ Slow, But Steady ◆

◼ PS Note/백준

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

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

 

느낀 점

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

 

반응형

'◼ 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
    '◼ PS Note/백준' 카테고리의 다른 글
    • [백준] 1929번 : 소수 구하기 (🥈실버 3)
    • [백준] 1037번 : 약수 (🥈실버 5) (Python)
    • [백준] 1026번 : 보물 (🥈실버 4) (Python)
    • [백준] 1652번 : 누울 자리를 찾아라 (🥉브론즈 1) (JavaScript)
    SangYoonLee (SYL)
    SangYoonLee (SYL)
    Slow, But Steady Wins The Race 😎

    티스토리툴바