๐๋ฌธ์ ์ค๋ช
๐์์ ๊ฐ์ ์ผ๊ฐํ์ ๊ผญ๋๊ธฐ์์ ๋ฐ๋ฅ๊น์ง ์ด์ด์ง๋ ๊ฒฝ๋ก ์ค, ๊ฑฐ์ณ๊ฐ ์ซ์์ ํฉ์ด ๊ฐ์ฅ ํฐ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์๋ณด๋ ค๊ณ ํฉ๋๋ค. ์๋ ์นธ์ผ๋ก ์ด๋ํ ๋๋ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ํ ์นธ ์ค๋ฅธ์ชฝ ๋๋ ์ผ์ชฝ์ผ๋ก๋ง ์ด๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด 3์์๋ ๊ทธ ์๋์นธ์ 8 ๋๋ 1๋ก๋ง ์ด๋์ด ๊ฐ๋ฅํฉ๋๋ค.
์ผ๊ฐํ์ ์ ๋ณด๊ฐ ๋ด๊ธด ๋ฐฐ์ด triangle์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๊ฑฐ์ณ๊ฐ ์ซ์์ ์ต๋๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
๐์ ํ์ฌํญ
๐พ์ ์ถ๋ ฅ ์
triangle | result |
---|---|
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] | 30 |
๐๋ฌธ์ ์ดํด ๋ฐ ํ์ด๊ณํ
โ๏ธ์ฒ์์๋ dfs, bfs ์ฒ๋ผ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๋ฉด์ ๋ชจ๋ ๊ฒฝ์ฐ์ ํฉ์ ๊ตฌํ๋ ค๊ณ ํ๋ค. ๊ทธ๋์ ํ๋ฅผ ๋ง๋ค์ด ๋ชจ๋ ๊ธธ์ ๋์์ง๋ง ์ญ์ ๋ต๋ ํ๋ฆฌ๊ณ ํจ์จ์ฑ๋ ๊ฝ์ด์๋ค.
โ๏ธ๊ฐ๋ ๊ธธ์ ํญ์ ์ ํด์ ธ ์๊ณ , ๊ฐ ๊ธธ์ ์ต๋๊ฐ์ ํญ์ ๊ทธ๋๋ก์ด๊ธฐ ๋๋ฌธ์ ์ด์ฐจ์ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด์ ์ ์ฅํด๋๋ฉด ๋งค๋ฒ ๊ธธ์ ์๋ก ๋ํ์ง ์์๋ ๋๋ค.
import java.util.*;
class Solution {
public class Status{
int idx, depth, sum;
public Status(int idx, int depth, int sum){
this.idx = idx;
this.depth = depth;
this.sum = sum;
}
}
public int solution(int[][] triangle) {
int answer = 0;
Queue<Status> q = new LinkedList<Status>();
int cur_idx = 0;
int cur_depth = 0;
int cur_sum = 0;
q.offer(new Status(0, 0, triangle[0][0])); // ์ถ๋ฐ์
while(!q.isEmpty()) {
Status status = (Status) q.poll();
cur_idx = status.idx;
cur_depth = status.depth;
cur_sum = status.sum;
// System.out.println(cur_sum);
if(cur_depth+1 < triangle.length && cur_idx+1 < triangle[cur_depth+1].length) {
q.offer(new Status(cur_idx, cur_depth+1, cur_sum+triangle[cur_depth+1][cur_idx]));
q.offer(new Status(cur_idx+1, cur_depth+1, cur_sum+triangle[cur_depth+1][cur_idx+1]));
}
if(cur_depth == triangle.length - 1) {
if(answer < cur_sum) answer = cur_sum;
}
}
return answer;
}
}
class Solution {
public int solution(int[][] triangle) {
int answer = 0;
int[][] dp = new int[triangle.length][triangle.length];
dp[0][0] = triangle[0][0];
for(int i=1; i<triangle.length; i++) {
dp[i][0] = triangle[i][0] + dp[i-1][0]; // (i, 0)์ ๋ฌด์กฐ๊ฑด 0๋ฒ์งธ๋ก๋ง ๋ํด์ง๋ค.
for(int j=1; j<=i; j++) {
dp[i][j] = triangle[i][j] + Math.max(dp[i-1][j-1], dp[i-1][j]);
}
}
for(int i=0; i<dp[triangle.length-1].length; i++) {
if(answer < dp[triangle.length-1][i]) answer = dp[triangle.length-1][i];
}
return answer;
}
}
โ๏ธ(i, 0)์ ๋ฌด์กฐ๊ฑด 0๋ฒ์งธ๋ง ๋ํด์ง๋ ์ฑ์ง์ ์ด์ฉํ์ฌ ๋ฐ๋ก if, else๋ก ๋๋์ง ์๊ณ ํ์ดํ๋ค.
โ๏ธ๋ง์ง๋ง์ answer๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ ๋ง์ง๋ง ์ค์ for๋ฌธ์ผ๋ก ํ๋ฒ ๋ ๋์๋๋ฐ, ๊ฐ์ฌ๋ ํ์ด๋ฐฉ๋ฒ์ฒ๋ผ Math.max๋ก ๊ณ์ ๋น๊ตํ๋ฉด์ ๊ฐฑ์ ํด ๋๊ฐ๋ค๋ฉด ์ฝ๋๋ฅผ ์ค์ผ ์ ์์ ๊ฒ ๊ฐ๋ค.
๐ญ๊ฐ์๋ด์ฉ
โ๏ธ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) : ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฐฉ๋ฒ(์ค๊ฐ์ ๊ณ์ฐ๋ ๊ฐ์ ์ ์ฅํด ๋์๋ค๊ฐ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ)
โ๏ธ๊ฐ๊ฐ์ ์ผ๊ฐํ์ผ๋ก ์ชผ๊ฐ์ ๊ทธ ์์์์ ์ต๋๊ฐ์ ์ ํํ๋ฉด ๋๋ค.
class Solution {
public int solution(int[][] triangle) {
int answer = 0; // ์ต๋๊ฐ
for(int i=1; i<triangle.length; i++) {
for(int j=0; j<triangle[i].length; j++) {
if(j == 0) { // right๊ฐ๋ง ์๋ ๊ฒฝ์ฐ
triangle[i][j] = triangle[i][j] + triangle[i-1][j];
}else if(i == j) { // left๋ง ์๋ ๊ฒฝ์ฐ
triangle[i][j] = triangle[i][j] + triangle[i-1][j-1];
}else {
int left = triangle[i][j] + triangle[i-1][j-1];
int right = triangle[i][j] + triangle[i-1][j];
triangle[i][j] = Math.max(left, right);
}
answer = Math.max(answer, triangle[i][j]);
}
}
return answer;
}
}
class Solution {
public int solution(int[][] triangle) {
for(int i=triangle.length-2; i>=0; i--) {
for(int j=0; j<triangle[i].length; j++) {
int left = triangle[i][j] + triangle[i+1][j];
int right = triangle[i][j] + triangle[i+1][j+1];
triangle[i][j] = Math.max(left, right);
}
}
return triangle[0][0]; // ๊ผญ๋๊ธฐ ๊ฐ
}
}
โ๏ธ์๋์์ ์๋ก ํธ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์น์ ๋ํ ๊ณ ๋ ค๋ฅผ ์ํด๋ ๋๊ธฐ ๋๋ฌธ์ ํ์ด๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง๋ค.
=> left, right๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋ํ ๊ณ ๋ ค๋ฅผ ํ์ง ์์๋ ๋จ! ํญ์ ์๊ธฐ ๋๋ฌธ์.
๐ก์๋์์ ์๋ก ํธ๋ ๋ฐฉ๋ฒ์ ์ ํ ์๊ฐํด๋ณด์ง๋ ์์์ ์ดํผ ๋จธ๋ฆฌ๊ฐ ๋ตํ๋ค. (์ฌ์ค ์ข๋ง ์๊ฐํด๋ณด๋ฉด ์ด๋ ต์ง ์์ ๋ฐฉ๋ฒ์ธ๋ฐ ์ด๋์ ๊ฐ์๋ฅผ ๋ค์ด์ผ ํ๋๋ณด๋ค.)