[Python] 백준/BOJ 1932번: 정수 삼각형 (Silver 1)

2025. 8. 19. 16:28·Algorithm/백준 (BOJ)
반응형

💻 Problem

문제 보러 가기

 

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

 

 

✏️ Solution 1

import sys
input = sys.stdin.readline

n = int(input())
triangle = [list(map(int, input().split())) for _ in range(n)]
dp = [[0] * i for i in range(1, n + 1)]
dp[0][0] = triangle[0][0]

for i in range(n - 1):
    for j in range(i + 1):
        dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + triangle[i + 1][j])
        dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + triangle[i + 1][j + 1])

print(max(dp[-1]))

dp 배열을 따로 선언해서 위에서부터 아래로 퍼뜨리는 방법이다.

맨 꼭대기부터 시작해서 두 자식(왼쪽 아래, 오른쪽 아래)으로 값을 전파하며 최댓값을 유지한다.

마지막행에서 최댓값이 정답이 된다.

 

✏️ Solution 2

import sys
input = sys.stdin.readline

n = int(input())
triangle = [list(map(int, input().split())) for _ in range(n)]

for i in range(1, n):
    for j in range(i + 1):
        if j == 0: # 맨 왼쪽
            triangle[i][j] += triangle[i - 1][j]
        elif j == i: # 맨 오른쪽
            triangle[i][j] += triangle[i - 1][j - 1]
        else: # 가운데
            triangle[i][j] += max(triangle[i - 1][j - 1], triangle[i - 1][j])

print(max(triangle[-1]))

dp 배열을 따로 선언하지 않고 삼각형을 그대로 최댓값 누적으로 덮어씌운다.

맨 왼쪽, 맨 오른쪽, 가운데를 분기해서 계산한다.

양 쪽 맨 끝은 부모가 하나이고 가운데는 부모가 둘이므로 가운데일 경우에만 두 부모의 값을 비교해서 더한다.

 

✏️ Solution 3 ☆

import sys
input = sys.stdin.readline

n = int(input())
triangle = [list(map(int, input().split())) for _ in range(n)]

for i in range(n - 2, -1, -1):
    for j in range(i + 1):
        triangle[i][j] += max(triangle[i + 1][j], triangle[i + 1][j + 1])

print(triangle[0][0])

아래에서 위로 최댓값을 누적하는 바텀업 방식이다.

위에서부터 생각하면서 부모에서 자식으로 퍼뜨릴지 자식에서 부모로 퍼뜨릴지만 생각했는데..

바텀업으로 하면 이렇게나 간단하다니 천재적인 방법..

가끔씩 이렇게 뒤집어야 더 편해지는 문제들이 있긴 한데.. 평소엔 떠올렸는데 이 문제에선 순간 떠올리지 못했음 ㅠㅠ

dp에 약한데 이 문제는 dp 치고는 쉽게 떠올릴 수 있는 문제 같다.

 

반응형

'Algorithm > 백준 (BOJ)' 카테고리의 다른 글

[Python] 백준/BOJ 17291번: 새끼치기 (Silver 2)  (0) 2025.08.22
[Python] 백준/BOJ 21760번: 야구 시즌 (Silver 5)  (0) 2025.08.20
[Python] 백준/BOJ 14500번: 테트로미노 (Gold 4)  (0) 2025.08.18
[Python] 백준/BOJ 14626번: ISBN (Bronze 1)  (5) 2025.08.17
'Algorithm/백준 (BOJ)' 카테고리의 다른 글
  • [Python] 백준/BOJ 17291번: 새끼치기 (Silver 2)
  • [Python] 백준/BOJ 21760번: 야구 시즌 (Silver 5)
  • [Python] 백준/BOJ 14500번: 테트로미노 (Gold 4)
  • [Python] 백준/BOJ 14626번: ISBN (Bronze 1)
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (196) N
      • SSAFY (10)
      • Algorithm (114) N
        • 이론 (6)
        • 백준 (BOJ) (107) N
        • 프로그래머스 (1)
      • Trouble Shooting (9)
      • Frontend (6)
      • React (17)
      • Next.js (4) N
      • Vue (4)
      • Node.js (2)
      • HTML (9)
      • DevOps (4)
        • Git (4)
      • Language (9)
        • JavaScript (0)
        • Java (9)
      • Embedded (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
      • 자격증 (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    순열
    React
    Java
    티스토리챌린지
    오블완
    중복조합
    수학
    SSAFY
    dfs
    Error
    힙
    Next.js
    블록체인
    DP
    html5
    구현
    싸피
    파이썬
    백준
    bfs
    중복순열
    Algorithm
    강의
    Heap
    백트래킹
    재귀
    SSAFYcial
    알고리즘
    브루트포스
    우선순위큐
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
올콩
[Python] 백준/BOJ 1932번: 정수 삼각형 (Silver 1)
상단으로

티스토리툴바