티스토리 뷰

백준

백준 1932: 정수 삼각형 - 파이썬

곽츠비 2023. 9. 22. 18:54

정수 삼각형  성공

 

1932번: 정수 삼각형

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

www.acmicpc.net

문제

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

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

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

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

입력

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

 

출력

첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

 

내 코드

 

import sys
n=int(sys.stdin.readline())

arr=[] #원본 삼각형을 저장했다가, 각 합을 누적하는 것으로 쓸 것임.
for _ in range(n): #각 줄을 리스트 형태로 arr에 저장.
    tmp_arr=list(map(int, sys.stdin.readline().split()))
    arr.append(tmp_arr)

for i in range(1,n): #제일 위에 줄은 패스하고 다음줄부터.
    for j in range(i+1): #i번째줄은 i+1개만큼 요소를 가진다.

        if j==0: #왼쪽 끝에 놈은 그냥 내 위에서 오른쪽놈 더하면 됨.
            arr[i][j]=arr[i-1][j]+arr[i][j]

        elif j==i: #오른쪽 끝에 놈은 그냥 내 위에서 왼쪽놈 더하면 됨.
            arr[i][j]=arr[i-1][j-1]+arr[i][j]

        else: #그 외에는 위에서 왼쪽놈과 오른쪽놈 중 큰놈을 선택해서 더해야 한다.
            arr[i][j]=arr[i][j]+max(arr[i-1][j-1],arr[i-1][j])

#제일 마지막 줄에 최종 합들이 누적되어 있는데, 그 중 최대값이 답이다.
answer=max(arr[n-1])
print(answer)

 

풀이 및 접근)

- 최대값이기 때문에 줄마다 합을 다 구하면서 최종 줄에서 가장 큰 놈으로 답을 정해야 한다. 별다른 short cut이 없기 때문에 일일이 다 더해가면서 누적해야 한다. 하지만 누적하는 과정에서 약간의 경우의 수를 나눌 수 있는데, 특정 요소가 왼쪽 끝이나 오른쪽 끝에 있다면 그저 대각선 위의 놈(양끝일 경우 하나밖에 없다)을 더하면 되지만, 그 외의 경우는 왼쪽위 대각선, 오른쪽위 대각선 두가지이다. 이 때, 둘 중 큰놈을 선택하면서 더해 가면, 최종 줄에서 최대값들의 후보군을 형성할 수 있다. 그 후보군들 중에서 최대값을 고르면 그것이 답이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함