์•Œ๊ณ ๋ฆฌ์ฆ˜/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Programmers Level 3 ] ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค

KIMHYEYUN 2021. 9. 30. 20:44
๋ฐ˜์‘ํ˜•

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

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค

[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800 [[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100 [[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[

programmers.co.kr

 

๋ฌธ์ œ ์„ค๋ช…


๊ฑด์„คํšŒ์‚ฌ์˜ ์„ค๊ณ„์‚ฌ์ธ ์ฃ ๋ฅด๋””๋Š” ๊ณ ๊ฐ์‚ฌ๋กœ๋ถ€ํ„ฐ ์ž๋™์ฐจ ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค์— ํ•„์š”ํ•œ ๊ฒฌ์ ์„ ์˜๋ขฐ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
์ œ๊ณต๋œ ๊ฒฝ์ฃผ๋กœ ์„ค๊ณ„ ๋„๋ฉด์— ๋”ฐ๋ฅด๋ฉด ๊ฒฝ์ฃผ๋กœ ๋ถ€์ง€๋Š” N x N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ํ˜•ํƒœ์ด๋ฉฐ ๊ฐ ๊ฒฉ์ž๋Š” 1 x 1 ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
์„ค๊ณ„ ๋„๋ฉด์—๋Š” ๊ฐ ๊ฒฉ์ž์˜ ์นธ์€ 0 ๋˜๋Š” 1 ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฉฐ, 0์€ ์นธ์ด ๋น„์–ด ์žˆ์Œ์„ 1์€ ํ•ด๋‹น ์นธ์ด ๋ฒฝ์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
๊ฒฝ์ฃผ๋กœ์˜ ์ถœ๋ฐœ์ ์€ (0, 0) ์นธ(์ขŒ์ธก ์ƒ๋‹จ)์ด๋ฉฐ, ๋„์ฐฉ์ ์€ (N-1, N-1) ์นธ(์šฐ์ธก ํ•˜๋‹จ)์ž…๋‹ˆ๋‹ค. ์ฃ ๋ฅด๋””๋Š” ์ถœ๋ฐœ์ ์ธ (0, 0) ์นธ์—์„œ ์ถœ๋ฐœํ•œ ์ž๋™์ฐจ๊ฐ€ ๋„์ฐฉ์ ์ธ (N-1, N-1) ์นธ๊นŒ์ง€ ๋ฌด์‚ฌํžˆ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ค‘๊ฐ„์— ๋Š๊ธฐ์ง€ ์•Š๋„๋ก ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ์ฃผ๋กœ๋Š” ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋‘ ๋นˆ ์นธ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ฑด์„คํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์ด ์žˆ๋Š” ์นธ์—๋Š” ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด๋•Œ, ์ธ์ ‘ํ•œ ๋‘ ๋นˆ ์นธ์„ ์ƒํ•˜ ๋˜๋Š” ์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒฝ์ฃผ๋กœ๋ฅผ ์ง์„  ๋„๋กœ ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋‘ ์ง์„  ๋„๋กœ๊ฐ€ ์„œ๋กœ ์ง๊ฐ์œผ๋กœ ๋งŒ๋‚˜๋Š” ์ง€์ ์„ ์ฝ”๋„ˆ ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
๊ฑด์„ค ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด ๋ณด๋‹ˆ ์ง์„  ๋„๋กœ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” 100์›์ด ์†Œ์š”๋˜๋ฉฐ, ์ฝ”๋„ˆ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค ๋•Œ๋Š” 500์›์ด ์ถ”๊ฐ€๋กœ ๋“ญ๋‹ˆ๋‹ค.
์ฃ ๋ฅด๋””๋Š” ๊ฒฌ์ ์„œ ์ž‘์„ฑ์„ ์œ„ํ•ด ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ง์„  ๋„๋กœ 6๊ฐœ์™€ ์ฝ”๋„ˆ 4๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ ์ž„์˜์˜ ๊ฒฝ์ฃผ๋กœ ์˜ˆ์‹œ์ด๋ฉฐ, ๊ฑด์„ค ๋น„์šฉ์€ 6 x 100 + 4 x 500 = 2600์› ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, ์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ง์„  ๋„๋กœ 4๊ฐœ์™€ ์ฝ”๋„ˆ 1๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์ฃผ๋กœ์ด๋ฉฐ, ๊ฑด์„ค ๋น„์šฉ์€ 4 x 100 + 1 x 500 = 900์› ์ž…๋‹ˆ๋‹ค.


๋„๋ฉด์˜ ์ƒํƒœ(0์€ ๋น„์–ด ์žˆ์Œ, 1์€ ๋ฒฝ)์„ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด board๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ


  • board๋Š” 2์ฐจ์› ์ •์‚ฌ๊ฐ ๋ฐฐ์—ด๋กœ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 3 ์ด์ƒ 25 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • board ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ์˜ ๊ฐ’์€ 0 ๋˜๋Š” 1 ์ž…๋‹ˆ๋‹ค.
    • ๋„๋ฉด์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์ƒ๋‹จ ์ขŒํ‘œ๋Š” (0, 0)์ด๋ฉฐ, ๊ฐ€์žฅ ์šฐ์ธก ํ•˜๋‹จ ์ขŒํ‘œ๋Š” (N-1, N-1) ์ž…๋‹ˆ๋‹ค.
    • ์›์†Œ์˜ ๊ฐ’ 0์€ ์นธ์ด ๋น„์–ด ์žˆ์–ด ๋„๋กœ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•จ์„ 1์€ ์นธ์ด ๋ฒฝ์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์–ด ๋„๋กœ ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • board๋Š” ํ•ญ์ƒ ์ถœ๋ฐœ์ ์—์„œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ถœ๋ฐœ์ ๊ณผ ๋„์ฐฉ์  ์นธ์˜ ์›์†Œ์˜ ๊ฐ’์€ ํ•ญ์ƒ 0์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

ํ’€์ด


์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ BFS๋กœ ํ’€์—ˆ๋Š”๋ฐ, ๋‹ค ์ž˜ ๋งž๋Š”๋“ฏ.... ํ•˜๋”๋‹ˆ 25๋ฒˆ์—์„œ ์žฅ๋ ฌํ•˜๊ฒŒ ์‹คํŒจ๐Ÿฅถ

๋„๋Œ€์ฒด ์Ÿค๋Š” ๋ญ๊ธธ๋ž˜....;; ํ•˜๋˜ ์ค‘ โ€ผ๏ธ

board = [

[0, 0, 0, 0, 0], 
[0, 1, 1, 1, 0], 
[0, 0, 1, 0, 0], 
[1, 0, 0, 0, 1], 
[0, 1, 1, 0, 0]

];

์ด๊ฒƒ์ด ๋ฌธ์ œ์ž„์„ ์•Œ๊ฒŒ๋จโ€ผ๏ธ์‚ฌ์‹ค ์งˆ๋ฌธ ์ฐธ๊ณ  ใ…Ž..

์ฒ˜์Œ [0, 0] ์—์„œ 1๏ธโƒฃ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ์™€ 2๏ธโƒฃ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ ๊ฐ€ ์žˆ๋Š”๋ฐ,  ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” 1๏ธโƒฃ๋ฒˆ์ด ๋” ์ ์€ ๋น„์šฉ (3000)์ด ๋‚˜์˜ค์ง€๋งŒ, ํ•œ ๋ฒˆ BFS ๋Œ๋ฆฐ ๊ฐ’์œผ๋กœ๋Š” 2๏ธโƒฃ๋ฒˆ์ธ 3300์ด ๋‚˜์˜จ๋‹ค.....์ด ๋‘ ๊ฒฝ์šฐ๋Š” [3, 3] ์„ ๊ณตํ†ต์œผ๋กœ ์ง€๋‚˜๋Š”๋ฐ, ์ด ์ง€์ ์—์„œ 1๏ธโƒฃ๋ฒˆ (1800) , 2๏ธโƒฃ๋ฒˆ (1600) ์œผ๋กœ 1๏ธโƒฃ๋ฒˆ์˜ ๋…ธ๋“œ๋“ค์ด ๋” ์ด์ƒ ํ์— ๋“ค์–ด์˜ค์ง€ ๋ชปํ•˜๊ณ  2๏ธโƒฃ๋ฒˆ์œผ๋กœ ์ž˜๋ชป๋œ ๋‹ต์ด ๋‚˜์™”๋˜ ๊ฒƒโ€ผ๏ธ

 

๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์€ BFS๋ฅผ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ / ์•„๋ž˜์ชฝ ๋ฐฉํ–ฅ ์œผ๋กœ ๋‘ ๋ฒˆ ๋Œ๋ ค์ฃผ์—ˆ๋‹ค. ๐Ÿคท‍โ™€๏ธ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š”๋ฐ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฆฌ....;;๐Ÿคฆ‍โ™€๏ธ

์ฝ”๋“œ


import java.util.LinkedList;
import java.util.Queue;

public class ๊ฒฝ์ฃผ๋กœ๊ฑด์„ค {
    static int[] dx = {-1,0,0,1};   // ์ƒ ์ขŒ ์šฐ ํ•˜
    static int[] dy = {0,-1,1,0};
    static boolean[][] isVisited;
    static int[][] costs;
    static int answer;
    static int n;

    public static class road{
        int x;
        int y;
        int dir;
        int cost;

        road(int x, int y, int dir, int cost){
            this.x = x;
            this.y = y;
            this.dir = dir;
            this.cost = cost;
        }

    }

    public static int solution(int[][] board) {
        answer = Integer.MAX_VALUE;

        costs = board;
        n = board.length;
        isVisited = new boolean[n][n];

        // ์ฒ˜์Œ ์‹œ์ž‘๋•Œ ๋ฐ‘์œผ๋กœ & ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ
        BFS(0, 0, 2, 0);
        BFS(0, 0, 3, 0);

        return answer;
    }

    private static void BFS(int x, int y, int dir, int cost) {
        Queue<road> q = new LinkedList<>();
        q.add(new road(x,y,dir,cost));
        isVisited[x][y] = true;

        while(!q.isEmpty()){
            road r = q.poll();

            int nowX = r.x;
            int nowY = r.y;
            int nowD = r.dir;
            int nowC = r.cost;

            if(nowX == n-1 && nowY == n-1){
                answer = Math.min(answer, nowC);
            }

            for(int i = 0 ; i < 4; i++){
                int nextX = nowX + dx[i];
                int nextY = nowY + dy[i];
                int nextD = i;
                int nextC = nowC;

                if(nextX < 0 || n <= nextX || nextY < 0 || n <= nextY || costs[nextX][nextY] == 1)
                    continue;

                if(nextD == nowD){
                    nextC += 100;
                }
                else 
                    nextC += 600;

                if(!isVisited[nextX][nextY] || costs[nextX][nextY] >= nextC){
                    isVisited[nextX][nextY] = true;
                    costs[nextX][nextY] = nextC;
                    q.offer(new road(nextX, nextY, nextD, nextC));
                }
            }
        }
    }
    
    public static void main(String[] args) {
        int[][] board = {
            {0, 0, 0, 0, 0}, 
            {0, 1, 1, 1, 0}, 
            {0, 0, 1, 0, 0}, 
            {1, 0, 0, 0, 1}, 
            {0, 1, 1, 0, 0}
        };
        System.out.println(solution(board));
    }
}

 

728x90
๋ฐ˜์‘ํ˜•