๐Ÿƒ๐Ÿปโ€โ™€๏ธ[์ปค๋ฎค๋Ÿฌ๋‹/1๊ธฐ] 3์ฃผ์ฐจA - ๋™์ ๊ณ„ํš๋ฒ•

์ด๋‚˜์˜ยท2021๋…„ 11์›” 17์ผ
0

์ปค๋ฎค๋Ÿฌ๋‹1๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
8/8
post-thumbnail

๐ŸŽฏ3์ฃผ์ฐจA "์ •์ˆ˜ ์‚ผ๊ฐํ˜•"

๐ŸŽƒ๋ฌธ์ œ์„ค๋ช…

๐Ÿ“์œ„์™€ ๊ฐ™์€ ์‚ผ๊ฐํ˜•์˜ ๊ผญ๋Œ€๊ธฐ์—์„œ ๋ฐ”๋‹ฅ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ๊ฒฝ๋กœ ์ค‘, ๊ฑฐ์ณ๊ฐ„ ์ˆซ์ž์˜ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์นธ ์˜ค๋ฅธ์ชฝ ๋˜๋Š” ์™ผ์ชฝ์œผ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 3์—์„œ๋Š” ๊ทธ ์•„๋ž˜์นธ์˜ 8 ๋˜๋Š” 1๋กœ๋งŒ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์‚ผ๊ฐํ˜•์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด triangle์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฑฐ์ณ๊ฐ„ ์ˆซ์ž์˜ ์ตœ๋Œ“๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.


๐Ÿ”’์ œํ•œ์‚ฌํ•ญ

  • ์‚ผ๊ฐํ˜•์˜ ๋†’์ด๋Š” 1 ์ด์ƒ 500 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์‚ผ๊ฐํ˜•์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์ˆซ์ž๋Š” 0 ์ด์ƒ 9,999 ์ดํ•˜์˜ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.

๐Ÿ’พ์ž…์ถœ๋ ฅ ์˜ˆ

triangleresult
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]30

๐ŸŒŸ๋ฌธ์ œ ์ดํ•ด ๋ฐ ํ’€์ด๊ณ„ํš

โœ๏ธ์ฒ˜์Œ์—๋Š” dfs, bfs ์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋Œ๋ฉด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ๋ฅผ ๋งŒ๋“ค์–ด ๋ชจ๋“  ๊ธธ์„ ๋Œ์•˜์ง€๋งŒ ์—ญ์‹œ ๋‹ต๋„ ํ‹€๋ฆฌ๊ณ  ํšจ์œจ์„ฑ๋„ ๊ฝ์ด์—ˆ๋‹ค.
โœ๏ธ๊ฐ€๋Š” ๊ธธ์€ ํ•ญ์ƒ ์ •ํ•ด์ ธ ์žˆ๊ณ , ๊ฐ ๊ธธ์˜ ์ตœ๋Œ€๊ฐ’์€ ํ•ญ์ƒ ๊ทธ๋Œ€๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ฐจ์› ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•ด๋‘๋ฉด ๋งค๋ฒˆ ๊ธธ์„ ์ƒˆ๋กœ ๋”ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


โœ๐Ÿป๋‚ด ์ฝ”๋“œ1 - ์˜ค๋‹ต์ฝ”๋“œ (์ •๋‹ต๋ฅ  32.1%)

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;
    }
}

โœ๐Ÿป๋‚ด ์ฝ”๋“œ2 - ์ •๋‹ต์ฝ”๋“œ

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) : ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฐฉ๋ฒ•(์ค‘๊ฐ„์— ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•)
โœ”๏ธ๊ฐ๊ฐ์˜ ์‚ผ๊ฐํ˜•์œผ๋กœ ์ชผ๊ฐœ์„œ ๊ทธ ์•ˆ์—์„œ์˜ ์ตœ๋Œ€๊ฐ’์„ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.

โœ๐Ÿป๊ฐ•์˜ ์ฝ”๋“œ1 - ์œ„์—์„œ ์•„๋ž˜๋กœ

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;
    }
}

โœ๐Ÿป๊ฐ•์˜ ์ฝ”๋“œ2 - ์•„๋ž˜์—์„œ ์œ„๋กœ

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๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๊ณ ๋ ค๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋จ! ํ•ญ์ƒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—.

๐Ÿ’ก์•„๋ž˜์—์„œ ์œ„๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์€ ์ „ํ˜€ ์ƒ๊ฐํ•ด๋ณด์ง€๋„ ์•Š์•„์„œ ์ดˆํผ ๋จธ๋ฆฌ๊ฐ€ ๋ตํ–ˆ๋‹ค. (์‚ฌ์‹ค ์ข€๋งŒ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์–ด๋ ต์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ธ๋ฐ ์ด๋ž˜์„œ ๊ฐ•์˜๋ฅผ ๋“ค์–ด์•ผ ํ•˜๋‚˜๋ณด๋‹ค.)

profile
์†Œํ†ตํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€