nayeoniee
개발공부 노트
nayeoniee
전체 방문자
오늘
어제
  • 분류 전체보기 (53)
    • Deep Learning (16)
      • 개념 정리 (6)
      • 논문 리뷰 (2)
      • 논문 구현 (0)
      • Object Detection (8)
    • Algorithm (16)
      • 개념 정리 (5)
      • 이코테 (1)
      • baekjoon (5)
      • programmers (4)
      • LeetCode (1)
    • Project (4)
      • Boostcamp AI Tech (4)
    • 자격증 (16)
      • AWS (1)
      • 정보처리기사 필기 (15)
    • 기타 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이코테
  • KLUE
  • 데이터제작
  • 프로그래머스
  • FLOPs
  • LIS
  • BFS
  • re
  • 그래프
  • selective search
  • 2-stage
  • 운영체제 #데이터베이스 관리시스템 #웹애플리케이션 #오픈소스 #OS #DBMS #WAS
  • aif-c01
  • boostcamp
  • 회고
  • wandb
  • 이진탐색
  • 백준
  • 딥러닝
  • 현행시스템파악
  • 1-stage
  • F1 Score
  • Anchor box
  • ELECTRA
  • dp
  • object detection
  • spatial pyramid pooling
  • python
  • 알고리즘
  • 서로소 집합

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayeoniee

개발공부 노트

Algorithm/baekjoon

[백준] 1932번 - 정수 삼각형 (python)

2022. 8. 12. 01:14

문제

위에서부터 시작해 아래로 내려오며 각 층의 수를 하나씩 선택해 더할 때, 총합이 최대가 되는 경로를 구하여라

 

문제 바로가기

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

 

풀이

  • 파란색 글씨가 입력으로 들어온 삼각형 모양의 숫자이고, 빨간색 글씨가 각 경우에서 누적합이 최댓값이 되는 경우이다. 코드에서 파란색이 num, 빨간색이 d에 해당한다.
  • 맨 위 꼭짓점은 더할 수 있는 값이 없으므로 자기 자신이다.

  • 왼쪽 변과 오른쪽에 있는 숫자의 경우, 자기 자신에 바로 위에 있는 숫자만 더할 수 있다.
  • 중앙에 있는 숫자의 경우, 자기 자신에 윗줄의 양옆 숫자 중 최댓값을 더한다. → 그림에서 삼각형을 보면 양옆이라서 d[i, j] = max(d[i-1, j], d[i-1, j+1]) + num[i, j]인 줄 알았는데, 2차원 리스트의 인덱스를 생각해보면 각 행의 열 인덱스가 0부터 시작하기 때문에 윗줄의 양옆 숫자가 아닌, 윗줄의 왼쪽과 바로 윗줄 숫자를 봐야 한다.

 

코드

import sys
read = sys.stdin.readline

n = int(input())
num = []
for i in range(n):
    num.append(list(map(int, read().split())))
d = [[0] * i for i in range(1, n+1)]  # 누적 합

print('num:', num)
print('d:', d)


for i in range(n):
    for j in range(i+1):
        # 맨 위 꼭지점
        if i == 0 and j == 0:
            d[i][j] = num[i][j]
        # 왼쪽 변에 해당하는 경우
        elif j == 0:
            d[i][j] = d[i-1][0] + num[i][j]
        # 오른쪽 변에 해당하는 경우
        elif j == i:
            d[i][j] = d[i-1][-1] + num[i][j]
        # 가운데 숫자인 경우
        else:
            d[i][j] = max(d[i-1][j-1], d[i-1][j]) + num[i][j]

print(max(d[n-1]))

 

'Algorithm > baekjoon' 카테고리의 다른 글

[백준] 18353번 - 병사 배치하기 (python)  (0) 2022.08.12
[백준] 11403번 - 경로 찾기 (python)  (0) 2022.08.11
[백준] 1463번 - 1로 만들기 (python)  (0) 2022.08.06
[백준] 12865번 - 평범한 배낭 (python)  (0) 2022.07.23
    'Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 18353번 - 병사 배치하기 (python)
    • [백준] 11403번 - 경로 찾기 (python)
    • [백준] 1463번 - 1로 만들기 (python)
    • [백준] 12865번 - 평범한 배낭 (python)
    nayeoniee
    nayeoniee

    티스토리툴바