티스토리 뷰
728x90
반응형
이번 포스팅은 동적계획법을 이용하는 정수 삼각형 문제입니다.
programmers.co.kr/learn/courses/30/lessons/43105?language=python3
이번 문제는 이진트리와 유사해 보이는 피라미드 형식의 Data가 주어질때
오직 좌하 or 우하 로만 이동하여 모든값의 합이 최대가 되게하는 문제입니다.
아래 예시를 보시죠.
하지만 해당 문제는 이진트리도, 이진 탐색트리도 아니기 때문에
위에서부터 답을 찾아내려가면 애로사항이 발생합니다.(요 경우는 욕심쟁이 방법이라고 봐야겠죠?)
예를들어서, 7 -> 8 -> 1 -> 7 -> 5 로 이동할 경우 해당 위치에서 항상 최선의 선택을 합니다.
하지만 이 경우 국소해가 전체 문제의 해와 일치하지 않습니다.
그렇다고, 위에서 내려오는 모든 경우의 수를 탐색하는것을 비효율적입니다.
□문제의 해답
제가 푼 방법은, 삼각형의 하부부터 올라오는 방법 입니다. 위 예제의 일부를 따서 보시죠
Leaf(삼각형의 최 하부)부터 바로 위의 Layer에서의 최적해를 찾아갑니다.
이렇게되면 최 상부에 도달했을 때 도출된 최적해는 전체 Data의 최적해가되어
해당 문제의 정답을 구할수 있게 됩니다.
아래는 Python으로 작성된 문제의 해답입니다.
def solution(triangle):
answer = 0
#정수삼각형을 뒤집어줍니다.(코드의 편의성을 위해서)
triangle.reverse()
#하부부터 순차적으로 국소해를 찾아갑니다.
for i in range(len(triangle)-1):
for j in range(len(triangle[i+1])):
#한층 위의 Layer의 Element마다
#↙,↘위치한 Element들과 더한 값을 비교하고
#더 큰 값으로 값을 치환해줍니다.
if (triangle[i+1][j] + triangle[i][j])>(triangle[i+1][j] + triangle[i][j+1]):
triangle[i+1][j] = triangle[i+1][j] + triangle[i][j]
else:
triangle[i+1][j] = triangle[i+1][j] + triangle[i][j+1]
#모든 최적해 산출이 끝나면 정수삼각형 맨 윗 부분에는
#모두 더했을때 최대값이 남습니다.
answer = triangle[-1][0]
return answer
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
탐욕법 - 조이스틱 (0) | 2021.06.02 |
---|---|
매운음식 성애자(Way Cruel) (0) | 2021.05.04 |
Hash - 완주하지 못한 선수 (0) | 2021.03.14 |
완전탐색 - 소수 찾기(Prime Number Search) (0) | 2021.03.07 |
스킬트리 문제 (0) | 2021.03.06 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 사칙연산
- git
- C++
- prime number
- 알고리즘
- hash
- 완전탐색 알고리즘
- Greedy알고리즘
- 병렬처리
- Sort알고리즘
- SIMD
- 코딩테스트
- Search알고리즘
- heap
- Python
- 자료구조
- stack
- 프로그래머스
- 분할정복
- 컴퓨터그래픽스
- 동적계획법
- AVX
- GDC
- 이분탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함