[백준] 2096: 내려가기 (DP, 파이썬)

2024. 10. 14. 18:15·코딩테스트/BOJ

📌 문제 조건

- 메모리 제한 4MB

 

📌 구해야 하는 정답

   N x 3 칸에 0~9의 숫자가 적혀있다. 

   첫 줄부터 마지막 줄까지 내려가면서 얻는 최대 점수와 최소 점수를 모두 구해야한다. 

   위 그림의 조건을 만족하면서 내려가야한다. 

📌 풀이 하기

1. DP 테이블 정의하기 

  • D = [[0, 0, 0], ... , [0, 0, 0]]로 정의한다면  N X 3크기의 공간을 차지하므로 현재 상태와 이전 상태를 저장하는 리스트만 있어도 충분하다. D[i]는 i번째 줄에서의 최대 점수의 합이다. 
  • 최대 값을 구하는 점화식은 다음과 같다. -> dp테이블이 공간을 잡아먹으므로 다른 방법을 사용한다 
    • D[i][0] = max(D[i - 1][0], D[i - 1][1]) + S[i][0]
    • D[i][1] = max(D[i - 1]) + S[i][1]
    • D[i][2] = max(D[i - 1][1], D[i - 1][2]) + S[i][2]
  • DP 테이블 크기를 줄인 점화식은 아래와 같다
cur_max[0] = max(prev_max[0], prev_max[1]) + S[0]
cur_max[1] = max(prev_max) + S[1]
cur_max[2] = max(prev_max[1], prev_max[2]) + S[2]

 

📌 코드 설계하기

  1. 입력 받는 첫 줄을 prev_max로 저장한다.
  2. 다음 입력 받는 줄을 curr_max로 저장한다.
  3. curr_max[0], curr_max[1], curr_max[2]에 대해 점화식을 적용한다. 
  4. min에도 max와 같은 방법을 적용한다.

📌 시도 회차 수정 사항

  • Q[0][0], Q[0][1], Q[0][2] = S[0][0], S[0][1], S[0][2] 는 반복문 밖에서 한 번만 초기화해야했다. 잘못된 위치에서 초기화 했다. 
  • 아래와 같이 코드를 짰더니 시간 초과가 떴다.
    • DP_MAX와 DP_MIN 함수는 각 행의 값들과 이전 행에서 계산된 결과에 의존하므로 전체 행렬을 저장할 필요 없이, 현재 행과 이전 행만 유지하면 된다.
import sys
input = sys.stdin.readline

N = int(input())
S = []
for _ in range(N):
    S.append(list(map(int, input().split())))

D = list([0] * 3 for _ in range(N))
Q = list([0] * 3 for _ in range(N))
def dp_max(D):
    for i in range(1, N):
        D[0][0], D[0][1], D[0][2] = S[0][0], S[0][1], S[0][2]
        D[i][0] = max(D[i - 1][0], D[i - 1][1]) + S[i][0]
        D[i][1] = max(D[i - 1]) + S[i][1]
        D[i][2] = max(D[i - 1][1], D[i - 1][2]) + S[i][2]
    return max(D[N - 1][0], D[N - 1][1], D[N - 1][2])

def dp_min(Q):
    for i in range(1, N):
        Q[0][0], Q[0][1], Q[0][2] = S[0][0], S[0][1], S[0][2]
        Q[i][0] = min(Q[i - 1][0], Q[i - 1][1]) + S[i][0]
        Q[i][1] = min(Q[i - 1]) + S[i][1]
        Q[i][2] = min(Q[i - 1][1], Q[i - 1][2]) + S[i][2]
    return min(Q[N - 1][0], Q[N - 1][1], Q[N - 1][2])

print(dp_max(D), dp_min(Q))

 

 

📌 정답 코드

import sys
sys.stdin = open('../input.txt')
input = sys.stdin.readline

N = int(input())
cur_max = [0] * 3
prev_max = list(map(int, input().split()))
cur_min = [0] * 3
prev_min = prev_max[:]

for _ in range(1, N):
    S = list(map(int, input().split()))
    cur_max[0] = max(prev_max[0], prev_max[1]) + S[0]
    cur_max[1] = max(prev_max) + S[1]
    cur_max[2] = max(prev_max[1], prev_max[2]) + S[2]

    cur_min[0] = min(prev_min[0], prev_min[1]) + S[0]
    cur_min[1] = min(prev_min) + S[1]
    cur_min[2] = min(prev_min[1], prev_min[2]) + S[2]

    prev_max = cur_max[:]
    prev_min = cur_min[:]

print(max(prev_max), min(prev_min))

'코딩테스트 > BOJ' 카테고리의 다른 글

[백준] 2503번: 숫자 야구 (구현, 파이썬)  (1) 2024.10.16
[백준] 13567번: 로봇 (구현, 파이썬)  (0) 2024.10.15
[백준] 14430: 자원 캐기 (파이썬)  (0) 2024.10.12
[백준] 10026: 적록색약  (0) 2024.10.10
[백준]27737번: 버섯농장  (0) 2024.10.10
'코딩테스트/BOJ' 카테고리의 다른 글
  • [백준] 2503번: 숫자 야구 (구현, 파이썬)
  • [백준] 13567번: 로봇 (구현, 파이썬)
  • [백준] 14430: 자원 캐기 (파이썬)
  • [백준] 10026: 적록색약
뚱이, not a starfish
뚱이, not a starfish
M.S. Student,. Mainly interested in computer vision and autonomous cars
  • 뚱이, not a starfish
    Wilbur-Babo
    뚱이, not a starfish
  • 전체
    오늘
    어제
    • 분류 전체보기 (194)
      • 통신 및 네트워크 (12)
      • Embedded Projects (2)
      • 3D Reconstruction (1)
        • Gaussian Splatting (0)
        • 3D-GS (1)
        • Multi-view Geometry (0)
        • VSLAM (0)
        • Computer Graphics (0)
      • LLM(VLM) (0)
      • AI-Study (28)
        • Mono-Depth (7)
        • Base (2)
        • Computer Vision (1)
        • Image Processing (3)
        • Tiny Object Detection (3)
      • 자율주행 (20)
        • [2023] 1-fifth AA EV (4)
        • [2022] 1-tenth AA EV (2)
        • ROS 1,2 (4)
        • 이론 (7)
        • 실습 (3)
      • Pointcloud (0)
      • sw (16)
        • 정보보안 (1)
        • Android_develop (3)
      • [학부] 전기전자공학 (12)
        • 반도체 (2)
        • 마이크로프로세서 (6)
      • 코딩테스트 (22)
        • BOJ (21)
      • 취준 (21)
        • EVS37 Ambassador (5)
        • 차량 제어 플랫폼 (5)
        • 영어 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    현차떨
    현차 자율주행
    EVS37
    현대자동차 자율주행 서류 합격 후기
    evs37 sdv
    자율주행자동차
    현대자동차 자율주행
    evs37sdv
    현대자동차 서류합격후기
    현차 3월 신입 서류
    심포지움
    현대차3월신입후기
    자율주행
    tar압축풀기
    오블완챌린지
    software defined vehicle
    현대자동차 연구개발
    헤네스
    tar 파일
    자율주행작품
    오픽후기
    정렬
    현대자동차최종불합
    자율주행시험
    rc카
    현차 3월 자율주행
    우분투터미널
    헤네스유아용자동차
    자율주행경진대회
    현대자동차최종면접결과
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
뚱이, not a starfish
[백준] 2096: 내려가기 (DP, 파이썬)
상단으로

티스토리툴바