๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[Java] - (Level2)๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์ฐพ๊ธฐ(DP)

by ์ฃผ๋ฐœ2 2020. 3. 16.
๋ฐ˜์‘ํ˜•

https://programmers.co.kr/learn/courses/30/lessons/12905

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

์ฝ”๋“œ

class Solution
{
    public int solution(int [][]board)
    {
        int answer = 0;
        int[][] newBoard = new int[board.length+1][board[0].length+1];
        // ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ์ƒ์„ฑ
        for(int i=0; i<board.length; i++)
            for(int j=0; j<board[i].length; j++)
                newBoard[i+1][j+1] = board[i][j];
        
        int max = 0;
        
        // ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ •์‚ฌ๊ฐํ˜• ๊ฒ€์‚ฌ
        for(int i=1; i<newBoard.length; i++){
            for(int j=1; j<newBoard[i].length; j++){
                /* 2x2 ์‚ฌ๊ฐํ˜•์˜ ์šฐ์ธกํ•˜๋‹จ ๊ผญ์ง“์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ •์‚ฌ๊ฐํ˜•์ด ๋˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
                 * ํ˜„์žฌ ๊ฐ’์ด 1์ธ๊ฒฝ์šฐ ์ขŒ←, ์ƒ↑, ์ขŒ์ƒโ†– ์ฒดํฌ 
                 * ←, ↑, โ†– ๊ฐ’์ด ๋ชจ๋‘ 1์ธ๊ฒฝ์šฐ ์ •์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
                */ 
                if(newBoard[i][j] == 1){
                    int left = newBoard[i-1][j];    // ์ขŒ์ธก ๊ฐ’
                    int up = newBoard[i][j-1];      // ์ƒ๋‹จ ๊ฐ’
                    int leftUp = newBoard[i-1][j-1];// ์ขŒ์ธก์ƒ๋‹จ(๋Œ€๊ฐ์„ ) ๊ฐ’
                    int min = Math.min(left, Math.min(up, leftUp)); 
                    newBoard[i][j] = min+1;
                    max = Math.max(max, min+1);
                }
            }
        }
        answer = max * max;
        return answer;
    }
}

ํ’€์ด

๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ๋ณด๊ณ  ๋“  ์ ‘๊ทผ๋ฐฉ์‹์€ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ •์‚ฌ๊ฐํ˜•์˜ ํฌ๊ธฐ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ์‹์ด์—ˆ๋Š”๋ฐ,

๊ทธ๋Ÿด๊ฒฝ์šฐ for๋ฌธ์ด 4๊ฐœ๋กœ O(n^4)์˜ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ์‹œ๊ฐ„์ดˆ๊ณผ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ดค์ง€๋งŒ ๋– ์˜ค๋ฅด์ง„ ์•Š์•˜๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜๋‹ˆ DP๋กœ ํ’€์—ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ? 

2x2 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ •์‚ฌ๊ฐํ˜•์„ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ, 

๋ฐฐ์—ด์˜ ํƒ์ƒ‰์„ →↓์šฐ์ธก์œผ๋กœ, ํ•˜๋‹จ์œผ๋กœ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์ธกํ•˜๋‹จ์˜ ๊ผญ์ง“์ ์„ ๊ธฐ์ค€์œผ๋กœ ์žก๋Š”๋‹ค.

 

 

๋ฌธ์ œ์˜ ์˜ˆ์ œ ์ž…์ถœ๋ ฅ์„ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด ํƒ์ƒ‰์€ ์œ„ ์ƒ‰์น ํ•œ (1,1) ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

(1,1)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ [์ขŒ์ธก, ์ƒ๋‹จ, ์ขŒ์ธก ์ƒ๋‹จ]์˜ ๊ฐ’์„ ํ™•์ธํ•ด๊ฐ€๋ฉฐ ํ˜„์žฌ ๊ฐ’์„ ์ตœ์†Ÿ๊ฐ’+1๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

์™œ ํ˜„์žฌ๊ฐ’์„ ์ตœ์†Ÿ๊ฐ’+1๋กœ ์„ค์ •ํ•˜๋Š”์ง€ ๋ณด์ž.

ํ˜„์žฌ (1,1)์„ ๊ธฐ์ค€์œผ๋กœ

์ขŒ์ธก(1,0) = 1

์ƒ๋‹จ(0,1) = 1

์ขŒ์ธก์ƒ๋‹จ(0,0) = 0

์ด๋‹ค. ๊ทธ๋Ÿผ ์ •์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ˜„์žฌ ๊ฐ’์„ ์ตœ์†Ÿ๊ฐ’+1 (0+1) = 1๋กœ ์„ค์ •ํ•œ๋‹ค.

 

๊ทธ๋Ÿผ (1,2)๋ฅผ ๋ณด๋ฉด [์ขŒ์ธก, ์ƒ๋‹จ, ์ขŒ์ธก ์ƒ๋‹จ]์˜ ๊ฐ’๋“ค์ด ์ „๋ถ€ 1์ด๋ฏ€๋กœ ํ˜„์žฌ๊ฐ’์€ 2๋กœ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

๋ฐฐ์—ด์˜ ๋๊นŒ์ง€ ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

๊ทธ๋Ÿผ ์œ„ ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํฌ๊ธฐ๋Š” ํ˜„์žฌ ๊ฐ’(3)์˜ ์ œ๊ณฑ์ด ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์œ„ ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด(newBoard)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ +1 ๋”ํ•ด์ค€ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ,

ํ–‰์ด 1์ด๊ฑฐ๋‚˜ ์—ด์ด 1์ธ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์ด ํ–‰์ด 1์ด๊ฑฐ๋‚˜, ์—ด์ด 1์ผ๊ฒฝ์šฐ ๊ฐ’์ด 1์ด ์žˆ์œผ๋ฉด ์ •์‚ฌ๊ฐํ˜•์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 1์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ +1๋กœ ์„ค์ •ํ•ด์ค˜์„œ, ๋ฐฐ์—ด์ด [0][n] ๊ฐ’๊ณผ [n][0]์˜ ๊ฐ’์„ ๋ชจ๋‘ 0์œผ๋กœ ์ฑ„์›Œ์„œ ๊ฒ€์ƒ‰ํ•ด์•ผํ•œ๋‹ค.

๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ +1๋กœ ์žก์•„์„œ ์„ค์ •ํ•ด์ฃผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด 0ํ–‰, 0์—ด ๊ธฐ์ค€์œผ๋กœ 0๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

๋น„์Šทํ•œ ๋ฌธ์ œ

๋ฐฑ์ค€ 1051 ์ˆซ์ž์ •์‚ฌ๊ฐํ˜•

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€