Algorithm/Python

[백준 1932] 정수 삼각형

🥭맹2 2021. 4. 27. 21:54

1. 문제

www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

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

www.acmicpc.net

2. 접근 방법

dp문제다.

 

삼각형이 아니라 2차 배열로 생각해보면 

 

input의 경우

 

0

0 0

0 0 0

0 0 0 0

 

이런 형상이다.

 

그럼 얘를 좌표로 나타내면 ([열(x), 행(y)]으로 나타냈습니다.)

 

           [0, 0]

       [0, 1] [1, 1]

    [0, 2] [1, 2] [2, 2]

[0, 3] [1, 3] [2, 3] [3, 3]

 

[0, 1]까지의 합은 [0, 0]과 [0, 1]을 더한 값

[1, 2]까지의 합은 [0, 1]과 [1, 1] 둘 중 더 큰 값과 [1, 2]를 더한 값

...

이렇게 하는 것을 알 수 있다.

 

따라서 [x, y]까지의 합은 max([x-1, y-1], [x, y-1]) + [x, y] 로 나타낼 수 있다.

 

이 때 합을 저장해주는 행렬을 N*N 행렬로 만들고 빈 값을 모두 0으로 채워주면, 오른쪽 영역은 신경쓰지 않아도 된다.

 

3. 코드

python

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

ans = [[0]*N for _ in range(N)]
ans[0][0] = board[0][0]

for y in range(1, N):
    for x in range(y+1):
        if x > 0:
            ans[y][x] = max(ans[y-1][x-1], ans[y-1][x]) + board[y][x]
        else:
            ans[y][x] = ans[y-1][x] + board[y][x]

print(max(ans[N-1]))

4. 마치며

.

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

[해시] 완주하지 못한 선수  (0) 2021.04.30
[백준 11399] ATM  (0) 2021.04.28
[swea 5650] 핀볼 게임  (0) 2021.04.24
[swea 5656] 벽돌깨기  (0) 2021.04.23
[swea 5658] 보물상자 비밀번호  (0) 2021.04.23