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

2023. 1. 22. 04:13·◼ PS Note/백준
반응형

문제 바로 가기

 

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 😎
    반응형
  • SangYoonLee (SYL)
    ◆ Slow, But Steady ◆
    SangYoonLee (SYL)
  • 전체
    오늘
    어제
    • ◻ 전체 글 수 : (131)
      • ✪ 취미, 경험 회고 및 일상 (26)
        • [취미] Room Escape (2)
        • [회고] IT 관련 경험 회고 (18)
        • [일상] 일상 생각 (4)
        • [일상] 독후감 (1)
      • ◼ FrontEnd (29)
        • Web & HTML, CSS (8)
        • JavaScript (4)
        • 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
    • 🧩 온라인 방탈출 출시 작품 모음
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    1929
    wecode
    unity
    주간 회고
    개인 프로젝트
    pygame
    JavaScript
    소수 구하기
    백준
    React
    프로그래머스
    더라비린스
    코딩 일기
    유니티
    후기
    프로젝트
    파이썬
    CodeSoom
    C++
    Python
    코드숨
    방탈출고사
    리엑트
    위코드
    알고리즘
    미궁 게임
    관심사의 분리
    Component
    회고
    Cpp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
SangYoonLee (SYL)
[백준] 1292번 : 쉽게 푸는 문제 (🥈실버 5) (Python)
상단으로

티스토리툴바