Solution )
밑으로 내려갈 수록 쌓여 내려간다. DFS 로 풀 수도 있겠지만, 경우의 수가 너무 많아지므로 효율이 떨어진다.
DP 방식, 즉 기억해서 써먹기 알고리즘으로 가야한다.
쉽게 접근하고자 삼각형을 배열(표) 형식으로 바꿔본다.
7 | 0 | 0 | 0 | 0 |
3 | 8 | 0 | 0 | 0 |
8 | 1 | 0 | 0 | 0 |
2 | 7 | 4 | 4 | 0 |
4 | 5 | 2 | 6 | 5 |
(Triangle 이중 배열)
* 빈칸으로 보일 수 있는 부분은 계산식 수립이 용이하도록 0을 채워넣었다.
삼각형을 배열(표)로 만든 것과 동일하게, SumList 라는 이중 배열을 하나 더 만들어주었다.
이 이중 배열의 용도는 해당 칸까지 내려간 수의 Sum, 총 합 값을 기억하기 위해서다.
7 | 0 | 0 | 0 | 0 |
10 | 15 | 0 | 0 | 0 |
18 | 16 | 15 | 0 | 0 |
20 | 25 | 20 | 19 | 0 |
24 | 30 | 27 | 26 | 24 |
(SumList 이중 배열)
*빨간 숫자는 해당 칸에 들어올 수 있는 Sum 값이 두 개일 때, 비교해 최댓값을 채워넣은 칸이다
이 때 알 수 있는 점은,
예를 들면 우리가 SumList 4행의 값들을 구하려고 할 때, SumList의 3행과 Triangle 배열의 4행이 각각 보유한 값들만 참고해서 SumList 4행을 구할 수 있다는 점이다.
DFS 로 했다면, 1행부터 마지막 행 까지 다 구해서 또 비교하는 일을 반복해야 했을 것이다.
DP의 요점은
1) 반복 작업의 효율화
2) 기억해서 가지고 있다가 써먹기
인 것 같다.
나도 DP 문제를 많이 풀어본 건 아니지만, 이 문제는 꾸준히 다시 풀어보는게 좋을 것 같아서 기록용으로 남긴다.
'C++ > 심심풀이땅콩코테' 카테고리의 다른 글
[프로그래머스 Lv.3] 베스트앨범 (0) | 2024.01.25 |
---|---|
[프로그래머스 Lv.2] H-Index (0) | 2024.01.24 |
[프로그래머스 Lv.0] 컨트롤 제트 (0) | 2023.03.27 |
[프로그래머스 Lv.2] 피보나치 수 (0) | 2023.03.20 |
[프로그래머스 Lv.1] 자릿수 더하기 (0) | 2023.03.13 |