๐ŸŽฏ Coding Test

[๋ฐฑ์ค€] 1932๋ฒˆ ์ •์ˆ˜ ์‚ผ๊ฐํ˜• ์ž๋ฐ” DP

์—ฐ_์šฐ๋ฆฌ 2022. 4. 4. 11:58
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ๋ฌธ์ œ

    https://www.acmicpc.net/problem/1932

     

     

     

     

    ํ’€์ด

    ์ผ๋‹จ ๊ฐ ํ–‰์—์„œ ์ตœ๋Œ€๊ฐ’์„ ์„ ํƒํ•ด์„œ ํ’€๋ฉด ์ •๋‹ต์ด ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž

    7 -> 8 -> 1 -> 7 -> 5 = 28

    ์ •๋‹ต์ธ 30๋ณด๋‹ค ์ž‘๋‹ค. ์ด๋ ‡๊ฒŒ ํ’€๋ฉด ํ‹€๋ฆฌ๊ฒŒ๋œ๋‹ค.

     

     

    DP๋ฌธ์ œ๋Š” ์ ํ™”์‹์„ ์„ธ์›Œ์„œ ํ’€์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

    ๋˜ํ•œ ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํŒŒ์•…ํ•ด์„œ "์ตœ์†Œ๊ฐ’", "์ตœ๋Œ€๊ฐ’"์„ ์ฐพ๊ฒŒ๋˜๋ฉด ๊ฐ’์„ ๋ˆ„์ ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.

    ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์ผ๋‹จ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ์ ํ™”์‹์„ ์ด๋Œ์–ด๋‚ธ๋‹ค.

    ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์€ 2๊ฐ€์ง€ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

     

    ์ ํ™”์‹ (x, y)

    A. [x][y] = [x-1][y-1] + [x][y]
    B. [x][y] = [x-1][y] + [x][y]

     

    1. x-1 < 0 ์ธ ๊ฒฝ์šฐ๋Š” ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค. (๋ฐฐ์—ด ์ธ๋ฑ์Šค๊ฐ€ -1์ด ๋˜๋‹ˆ๊นŒ)

    2. ๊ฐ ํ–‰์˜ ๋งจ ์ฒซ๋ฒˆ์งธ ๊ฐ’์€ [x-1][y]๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด๋œ๋‹ค.

    3. ๊ฐ ํ–‰์˜ ๋งจ ๋งˆ์ง€๋ง‰ ๊ฐ’์€ [x-1][y-1]๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด๋œ๋‹ค. 

     

     

     

     

     

    ์ œ์ถœ์ฝ”๋“œ

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    
    public class Main {
    
        static int[][] triangle = null;
        static int sum = 0;
        static int N = 0;
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            N = Integer.parseInt(br.readLine());
            triangle = new int[N][N];
    
            //์ž…๋ ฅ๋ฐ›๊ธฐ
            for (int i = 0; i < N; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                int count = st.countTokens();
                for (int j = 0; j < count; j++) {
                     triangle[i][j] = Integer.parseInt(st.nextToken());
                     process(i, j);
                     sum = Math.max(sum, triangle[i][j]);
                }
                //print();
            }
    
            System.out.println(sum);
        }
    
    
    
        private static void process(int i, int j) {
            //System.out.println("("+i+", "+j+")");
    
            if(i-1 < 0){
                return;
            }
    
            int tempA = 0;
            if(j-1 >= 0){
                tempA = triangle[i-1][j-1] + triangle[i][j];
            }
            int tempB = triangle[i-1][j] + triangle[i][j];
    
            triangle[i][j] = Math.max(tempA, tempB);
            //sum = Math.max(sum, triangle[i][j]);
            //N์ด 1์ผ๋•Œ sum์€ ๊ณ„์† 0์œผ๋กœ ๋‚˜์˜ฌ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์ชฝ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ฒจ์ฃผ์–ด์•ผํ•œ๋‹ค.
            
            //(3, 0)์ธ ๊ฒฝ์šฐ tempB(2, 0)๋งŒ ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.
            //(3, 3)์ธ ๊ฒฝ์šฐ tempA(2, 2)์™€ tempB(2, 3)์ด ํ• ๋‹น๋˜์ง€๋งŒ tempB(2, 3)์€ ์–ด์ฐจํ”ผ 0 ์ด๊ธฐ ๋•Œ๋ฌธ์— max๊ฐ’์ธ tempA๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.
        }
    
    
        private static void print() {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    System.out.print(triangle[i][j] + " ");
                }
                System.out.println();
            }
            System.out.println();
        }
    }
    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ