[백준] 점프 (DP) 참고 정리

2025. 7. 17. 13:56·Algorithm/Coding Test Records

[백준] 점프 문제 풀이 https://orion-log.tistory.com/96


참고할 주요 개념 설명

✅ Java에서 자료형 범위 – long을 쓰라는 명확한 신호

문제에서 “경로 수는 2⁶³ - 1보다 작거나 같다”는 조건은 사실상 다음 의미와 같다:

👉 int로는 절대 안 되고 long을 써야 한다는 공식 힌트

자료형 바이트 수 표현 가능 범위
byte 1 byte -2⁷ ~ 2⁷ - 1 (-128 ~ 127)
short 2 bytes -2¹⁵ ~ 2¹⁵ - 1 (-32,768 ~ 32,767)
int 4 bytes -2³¹ ~ 2³¹ - 1 (약 21억)
long 8 bytes -2⁶³ ~ 2⁶³ - 1 (약 ±9.2×10¹⁸)

예시로 dp[i][j] += dp[x][y] 연산이 수십억 번 중첩될 수 있으므로, int는 누적 과정에서 오버플로우 위험이 있음
→ 따라서 long으로 경로 수를 세는 것이 사실상 필수 조건


✅ BFS로 풀면 메모리 초과가 나는 이유

1. BFS 방식의 특징 요약

항목 현재 코드가 사용하는 방법 메모리 사용 추정 위험 요인
게임판 int[N][N] 고정 크기 100×100 약 40 KB 안전
ArrayDeque<Object> 내부 배열 초기 용량 16 → 자동 확장 약 O(큐 크기 × 8 bytes) 큐가 커질수록 폭발적으로 증가
좌표 객체 new int[]{r,c} 객체 헤더(12~16 B) + int 2개(8 B) ≈ 24 B 경로 수만큼 객체 생성 수십만~수백만 개 생성 시 초과 위험

2. 왜 큐가 폭발하는가?

1) 중복 방문을 막기 어려움
  • 경로 수를 세는 문제이므로, 같은 좌표 (i,j)라도 경로가 다르면 독립적으로 처리해야 함
  • BFS에서 방문한 적 있는 좌표라도 또 큐에 넣음 → 중복 삽입 많음
2) 경로 수 자체가 천문학적이다
  • 예: 모든 칸의 값이 1이면, (0,0) → (N-1,N-1)까지 총 2×(N-1)번 이동 필요
  • 가능한 경로 수:
    $\binom{198}{99} \approx 9 \times 10^{58} \quad (N = 100 \text{일 때})$
  • 이 중 **극히 일부만 큐에 들어 있어도 메모리 한계(128MB)**를 금방 초과
3) 좌표 객체의 메모리 사용량이 상당함
  • 큐에 들어가는 new int[]{r, c}는 객체당 약 24~28 B
  • 100만 개만 삽입해도 약 25 MB
  • 중복 경로와 맞물려 큐 용량이 무제한 확장됨

✅ Java 객체의 구조와 int[]가 메모리를 많이 먹는 이유

📦 Java 객체의 메모리 레이아웃

JVM에서 객체는 다음 3단계로 메모리에 저장됨:

[ 객체 헤더 | 인스턴스 변수들 | 정렬 패딩 ]

객체 헤더의 구성 (64비트 JVM 기준)

항목 크기 설명
Mark Word 8 bytes GC 정보, 해시값, 락(lock) 등 메타데이터
Class Pointer 8 bytes 객체가 어떤 클래스인지 가리키는 포인터
배열 길이 (배열일 경우) 4 bytes 배열인 경우만 존재하는 크기 정보
정렬 패딩 0~4 bytes 8 bytes 단위 정렬용 여유 공간

예시: new int[]{x, y} 객체 하나의 실제 메모리 사용

int[] pos = new int[]{5, 7};
항목 크기
객체 헤더 16 bytes
배열 길이 정보 4 bytes
데이터(int 2개) 8 bytes
정렬 패딩 (필요 시) 0~4 bytes
합계 약 24~28 bytes

즉, BFS 큐에 좌표 객체를 100만 개만 넣어도 약 25MB 소모
큐 확장과 중복 삽입이 반복되면 금방 128MB 초과


🔗 참고 자료

자료 제목 설명
Oracle JVM 구조 설명서 JVM 구조 설명
Java Object Layout (JOL) JVM의 객체 레이아웃 체계를 분석하는 도구

'Algorithm > Coding Test Records' 카테고리의 다른 글

[백준] 사회망 서비스(SNS) (tree DP)  (2) 2025.08.17
[백준] 수들의 합4 (누적합)  (2) 2025.08.10
[백준] 점프 (DP)  (0) 2025.07.17
[백준] 에디터 (Deque)  (0) 2025.07.16
[백준] 두 수의 합 (카운팅 배열)  (0) 2025.07.15
'Algorithm/Coding Test Records' 카테고리의 다른 글
  • [백준] 사회망 서비스(SNS) (tree DP)
  • [백준] 수들의 합4 (누적합)
  • [백준] 점프 (DP)
  • [백준] 에디터 (Deque)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    백준
    프로그래머스
    Kotlin
    알고리즘고득점kit
    java
    Level3
    코테
    시뮬레이션
    Level2
    greedy
    boostcamp
    문법정리
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[백준] 점프 (DP) 참고 정리
상단으로

티스토리툴바