티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/43105?language=python3
코딩테스트 연습 - 정수 삼각형
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30
programmers.co.kr
기본적인 DP(Dynamic Programming)문제 입니다.
어떤 경로로 가는것이 최고의 합이 나오는지 궁금한 문제 입니다.
예시 풀이
첫번째줄에서 두번째줄로 갈때 7 에서 3 또는 8 을 고를때 8을 고르는게 좋을 수 있지만 8을 선택하면 세번째줄의 8을 고르지 못할 수 있습니다. 만약 세번째줄의 8이 100이었으면 그때그때 최선의 숫자를 고르는것은 좋지 않은 선택이 될 수 있습니다.
따라서 가능한 경우의 수를 모두 구하는것이 좋습니다.
위에서 아래방향으로 내려올 경우 3과 8의경우 둘다 맨 왼쪽, 맨 오른쪽값이기 때문에 7을 고를 수 밖에 없습니다. 이런 예외를 처리 해줘야 하는게 어려울 수 있으므로 반대로 아래에서 위로 올라가면서 더해주는 방법을 선택 했습니다. DP는 그때그때 전단계의 최선의 답을 저장해두고 다음에도 사용하는 방법 입니다.
밑에서 두번째 2의 경우 5가 최선. 따라서 2까지 올때 최선의값은 (5+2) = 7이 될것입니다.
밑에서 두번째 7의 경우에도 5가 최선 (5 + 7) = 12가 될것입니다. 이런식으로 4, 4에 최선의값을 할당해주고
밑에서 세번째 8은 지금 밑에서 나온 2와 7의 최선의 값 7, 12 중에 12를 뽑아서 12 + 8 = 20이 될것이고
이런식으로 올라가다보면 7은 최선의값 30이 나오게 됩니다.
코드
def solution(triangle):
length = len(triangle)
triangle = list(reversed(triangle))
dp = [[] for _ in range(length)]
dp[0] = triangle[0]
for i in range(1, length):
for j in range(len(triangle[i])):
dp[i].append(max(dp[i-1][j],dp[i-1][j+1]) + triangle[i][j])
return dp[-1][0]
'ALGORITHM > Programmers' 카테고리의 다른 글
[프로그래머스] 징검다리 건너기.py (0) | 2022.05.07 |
---|---|
[프로그래머스] 신고 결과 받기.py (0) | 2022.01.23 |
프로그래머스 큰 수 만들기.py (0) | 2021.12.05 |
[프로그래머스] 프렌즈4블록.py (0) | 2021.11.15 |
[프로그래머스] N개의 최소공배수.go (0) | 2021.11.01 |
- Total
- Today
- Yesterday
- 팰린드롬수
- Two Scoops of Django
- query
- 방금그곡
- stdout
- sql lite
- leetcode
- 백준
- conTeXt
- 의대 신경학 강의
- go context
- 독후감
- go
- ManyToMany
- dfs
- Python
- gunicorn
- 문자열 뒤집기
- 프로그래머스
- 파이썬
- 소프트웨어 장인
- taggit
- django
- for-else
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |