https://programmers.co.kr/learn/courses/30/lessons/43105
문제 설명
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
제한사항
- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예
triangle | result |
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] | 30 |
◆ 문제풀이
- 비어있는 리스트 memo를 만들어 하나씩 저장한다.(Memorial)
- 아래사진과 같이 다섯번째줄의 세번째 숫자 '2' (triangle[4][2])로 경로가 오는 경우는 네번째줄의 두번째숫자 '7'(triangle[3][1])과 세번째숫자 '4' (triangle[3][2])이다.
- 즉, triangle[i][j]로 오는 경우는 triangle[i-1][j-1], triangle[i-1][j] 둘 중에 하나이다.
- memo[i][j]가 왼쪽끝에 있는 경우(j=0)는 memo[i-1][j]에서만 올수 있으며, 오른쪽 끝에있는 경우(j가 가장 마지막)는 memo[i-1][j-1]에서만 올 수 있다.
◆ 코드풀이
def solution(triangle):
memo=[[0 for _ in range(j)] for j in range(1,len(triangle)+1)]
memo[0][0] = triangle[0][0]
memo[1][0] = memo[0][0] + triangle[1][0]
memo[1][1] = memo[0][0] + triangle[1][1]
for i in range(2,len(triangle)):
for j in range(0,i+1):
if j ==0: #memo[i][j]가 가장 왼쪽에 있는 경우
memo[i][j] = memo[i-1][j] + triangle[i][j]
elif j == i: #memo[i][j]가 가장 오른쪽에 있는 경우
memo[i][j] = memo[i-1][j-1] + triangle[i][j]
else:
memo[i][j]= max(memo[i-1][j-1], memo[i-1][j]) + triangle[i][j]
return max(memo[-1])
728x90
반응형
'자격증 & 문제풀이 > 프로그래머스 코딩 문제 풀이' 카테고리의 다른 글
[python 파이썬] [프로그래머스] 크레인 인형뽑기 게임(2019 카카오 개발자 겨울 인턴십) (0) | 2020.06.19 |
---|---|
[python 파이썬] [프로그래머스] 문자열 압축(2020 KAKAO BLIND RECRUITMENT) (0) | 2020.06.19 |
[python 파이썬][프로그래머스] 구명보트(Deque) (0) | 2020.06.12 |
[python 파이썬][프로그래머스] 기능개발(스택/큐) (0) | 2020.06.12 |
[python 파이썬][프로그래머스] 쇠막대기 (스택/큐) (0) | 2020.06.12 |