이 영역을 누르면 첫 페이지로 이동
포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

페이지 맨 위로 올라가기

포렌식 & 개발 이야기 - Forensics & Development

Pental - Forensics / iOS / Windows / Android / Kakaotalk / Telegram / Etc

[골드 5] 백준 1354 - 무한 수열 2 (파이썬)

  • 2025.07.01 10:47
  • Programming/백준
글 작성자: pental

https://www.acmicpc.net/problem/1354

풀이

A(0) = 1  
A(n) = A(n // P - X) + A(n // Q - Y)   (n > 0)

주어진 N에 대해서 A(N)을 구하는 문제이다.

  1. 기본 수열 정의
    • A(n)은 자기보다 작은 인덱스들의 결과를 이용해 계산됨 → 전형적인 DP 구조
  2. 문제점
    • N이 최대 10^12이기 때문에 일반적인 리스트 기반 DP(dp = [0]*(N+1))는 메모리 초과 → 딕셔너리 기반 메모이제이션 사용
  3. 점화식 재귀 정의
    • 점화식에 따라 다음과 같이 재귀함수 작성
    A(n) = A(n // P - X) + A(n // Q - Y)
    
  4. 기저 조건
    • n <= 0인 경우에는 항상 1 반환 (문제에서 정의됨)
  5. 메모이제이션
    • 계산된 결과는 cache[n]에 저장해서 중복 호출 방지
def dp(n):
    if n <= 0:
        return 1
    if n in cache:
        return cache[n]
    ret = dp(n // P - X) + dp(n // Q - Y)
    cache[n] = ret
    return ret

재귀 함수를 정의한다.

시간복잡도 분석

최악의 경우 호출 횟수

중복 호출을 피하므로, n이 다른 값으로 나뉘는 모든 경우의 수만큼만 호출됨. 정확한 횟수는 P, Q, X, Y의 값에 따라 달라지지만, 실질적으로 중복 없이 적은 수의 재귀 호출만 발생함.

  • 시간 복잡도→ 보통 O(log N) ~ O(N) 사이의 작은 값
  • 거의 모든 값은 O(number of unique states)
  • 공간 복잡도→ O(number of unique calls) = 수천 ~ 수십만 정도로 충분히 가능
  • 딕셔너리 크기 = 계산에 참여하는 서로 다른 n의 개수

코드

# 백준 1354 - 무한 수열 2
# 분류 : 다이나믹 프로그래밍

import sys
sys.setrecursionlimit(10 ** 7)

N, P, Q, X, Y = map(int, input().split())

cache = {}
def dp(n) :
    if n <= 0 :
        return 1
    if n in cache :
        return cache[n]
    ret = dp(n / P - X) + dp(n / Q - Y)
    cache[n] = ret
    return ret

print(dp(N))
import sys
sys.setrecursionlimit(10 ** 7)

N, P, Q, X, Y = map(int, input().split())

cache = {}

def dp(n):
    if n <= 0:
        return 1
    if n in cache:
        return cache[n]
    
    # n // P - X 와 n // Q - Y 로 int 계산
    cache[n] = dp(n // P - X) + dp(n // Q - Y)
    return cache[n]

print(dp(N))
저작자표시 비영리 (새창열림)

'Programming > 백준' 카테고리의 다른 글

[플래티넘 5] 백준 1102 - 발전소 (파이썬)  (0) 2025.07.01
[골드 4] 백준 17404 - RGB거리 2 (파이썬)  (1) 2025.06.30
[실버 4] 백준 9575 - 행운의 수 (파이썬)  (0) 2025.06.30
[골드 4] 백준 14395 - 4연산 (파이썬)  (0) 2025.06.29
[골드 2] 백준 1507 - 궁금한 민호 (파이썬)  (0) 2025.06.28

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [플래티넘 5] 백준 1102 - 발전소 (파이썬)

    [플래티넘 5] 백준 1102 - 발전소 (파이썬)

    2025.07.01
  • [골드 4] 백준 17404 - RGB거리 2 (파이썬)

    [골드 4] 백준 17404 - RGB거리 2 (파이썬)

    2025.06.30
  • [실버 4] 백준 9575 - 행운의 수 (파이썬)

    [실버 4] 백준 9575 - 행운의 수 (파이썬)

    2025.06.30
  • [골드 4] 백준 14395 - 4연산 (파이썬)

    [골드 4] 백준 14395 - 4연산 (파이썬)

    2025.06.29
다른 글 더 둘러보기

정보

포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

  • 포렌식 & 개발 이야기 - Forensics & Development의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

카테고리

  • Category (470) N
    • Forensics (19)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (25) N
      • DFC (7)
      • 디지털포렌식전문가2급 자격증 (10)
      • FTK ACE 자격증 (7)
    • 이것저것 (7)
      • Ubuntu (6)
      • 디스코드 봇 (4)
      • Volatility GUI (2)
    • CTF (32)
      • NEWSECU (14)
      • CTF-d (5)
      • Puzzel - Network Forensics (2)
      • Security Traps (2)
      • system32.kr (5)
      • HMCTF (4)
    • Programming (278) N
      • C (10)
      • Python (11)
      • 백준 (224) N
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 파이썬
  • pental
  • 포렌식
  • 프로그래머스
  • Forensics
  • axiom
  • 백준
  • 디지털포렌식
  • 전체 보기…

정보

pental의 포렌식 & 개발 이야기 - Forensics & Development

포렌식 & 개발 이야기 - Forensics & Development

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © pental.

티스토리툴바