λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/Programmers

[Programmers] 블둝 μ΄λ™ν•˜κΈ°(2020 KAKAO BLIND RECRUITMENT)

[Programmers] 블둝 μ΄λ™ν•˜κΈ°(2020 KAKAO BLIND RECRUITMENT) JAVA

문제 : 블둝 μ΄λ™ν•˜κΈ°(2020 KAKAO BLIND RECRUITMENT)

문제 μ„€λͺ…

1*2 크기의 λ“œλ‘ (2*1둜 νšŒμ „μ΄ κ°€λŠ₯ν•˜λ‹€.)이 μ§€λ„μ—μ„œ λ§‰νžˆμ§€ μ•Šμ€ 곳을 톡해 움직일 λ•Œ, n*n μΉΈ(였λ₯Έμͺ½ μ•„λž˜ λ§ˆμ§€λ§‰ μΉΈ)으둜 κ°€λŠ” μ΅œμ†Œν•œμ˜ μ›€μ§μž„μ„ 좜λ ₯ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

λ“œλ‘ μ€ 상, ν•˜, 쒌, 우둜 움직일 수 있고 κ°€λ‘œμ—μ„œ μ„Έλ‘œλ‘œ, μ„Έλ‘œμ—μ„œ κ°€λ‘œλ‘œ νšŒμ „ν•  수 μžˆλŠ”λ°, νšŒμ „ν•  λ•Œ λ‹ΏλŠ” 지도가 λ§‰ν˜€μžˆμœΌλ©΄ νšŒμ „μ΄ μ•ˆ λ©λ‹ˆλ‹€.(μžμ„Έν•œ 건 그림으둜 λ‚˜μ™€μžˆμŠ΅λ‹ˆλ‹€.)


Solution

bfs

bfs둜 λ“œλ‘ μ΄ ν•œ μΉΈμ”© 움직일 λ•Œλ§ˆλ‹€ λ°©λ¬Έν•œ 거리λ₯Ό 1μ”© 더해주며 μ΅œμ’… n*n에 λ‹Ώμ•˜μ„ λ•Œ μ΅œμ’… 값을 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ‹€λ§Œ λ‹¨μˆœν•˜κ²Œ 1*1 크기의 μ‚¬λžŒμ΄λ‚˜ 사물이 μ›€μ§μ΄λ˜ 기쑴의 bfs λ¬Έμ œμ™€ λ‹€λ₯΄κ²Œ 두 칸을 μ°¨μ§€ν•˜λŠ” λ“œλ‘ μ΄λΌ λ¬Έμ œκ°€ 더 λ³΅μž‘ν•΄μ§‘λ‹ˆλ‹€.

μ €λŠ” 기쑴의 intν˜• λ°©λ¬Έ 배열을 2차원 배열이 μ•„λ‹Œ, 3차원 λ°°μ—΄λ‘œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

vis[λ“œλ‘ μ΄ κ°€λ‘œλ©΄ 0, μ„Έλ‘œλ©΄ 1][μ„Έλ‘œ μ’Œν‘œ][κ°€λ‘œ μ’Œν‘œ]

μ΄λ•Œ μ„Έλ‘œ μ’Œν‘œμ™€ κ°€λ‘œ μ’Œν‘œκ°€ κ°€λ¦¬ν‚€λŠ” 1*1 크기의 μ§€λ„λŠ” λ“œλ‘ μ΄ κ°€λ‘œλ©΄ μ™Όμͺ½ μΉΈ, λ“œλ‘ μ΄ μ„Έλ‘œλ©΄ μœ„μͺ½ 칸을 κ°€λ¦¬ν‚€κ²Œ ν•¨μœΌλ‘œμ¨ λ°©λ¬Έ μ—¬λΆ€λ₯Ό κ΅¬λ³„ν•˜κ²Œ ν–ˆμŠ΅λ‹ˆλ‹€.

또 λ“œλ‘ μ΄ 움직일 수 μžˆμ„ λ•Œμ˜ 경우의 μˆ˜λŠ” μ—¬λŸ¬ 가지 μ‹œλ„λ₯Ό ν•΄λ΄€μ§€λ§Œ,

λ“œλ‘ μ΄ κ°€λ‘œ 일 λ•Œ - 상, ν•˜, 쒌, 우둜 μ›€μ§μ΄κ±°λ‚˜, μœ„λ‘œ νšŒμ „ 2가지, μ•„λž˜λ‘œ νšŒμ „ 2가지

λ“œλ‘ μ΄ μ„Έλ‘œ 일 λ•Œ - 상, ν•˜, 쒌, 우둜 μ›€μ§μ΄κ±°λ‚˜, μœ„λ‘œ νšŒμ „ 2가지, μ•„λž˜λ‘œ νšŒμ „ 2가지

둜 총 16κ°€μ§€μ˜ if 문을 λ§Œλ“€μ–΄ queue에 λ‹΄λŠ” μ‹μœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.


Description

  • vis 배열에 μ €μž₯ν•˜λŠ” λ°©ν–₯, μ„Έλ‘œ μ’Œν‘œ, κ°€λ‘œ μ’Œν‘œμ˜ μ„Έ 가지 λ°μ΄ν„°λŠ” NodeλΌλŠ” 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

μ†ŒμŠ€μ½”λ“œ

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

class Node{
    private int x;
    private int y;
    private int dir;

    public Node(int dir, int x, int y){
        this.x = x;
        this.y = y;
        this.dir = dir;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getDir() {
        return dir;
    }
}

class Solution {

    public static int[][][] vis;
    public static int n;
    public static int inf;
    public static Queue<Node> q = new LinkedList<>();

    public int solution(int[][] board) {
        n = board.length;
        inf = n*n + 1;
        vis = new int[2][n][n];
        for(int i=0; i<2; i++){
            for(int j=0; j<n; j++){
                for(int k=0; k<n;k++){
                    vis[i][j][k] = inf;
                }
            }
        }
        q.offer(new Node(0,0,0));
        vis[0][0][0] = 0;
        while (!q.isEmpty()){
            Node node = q.poll();
            int dir = node.getDir();
            int x = node.getX();
            int y = node.getY();
            int nextCnt = vis[dir][x][y] + 1;
            if(dir==0){
                if(y+2<n && board[x][y+2]==0 && vis[0][x][y+1]==inf){
                    vis[0][x][y+1] = nextCnt;
                    q.offer(new Node(0,x,y+1));
                }
                if(y-1>=0 && board[x][y-1]==0 && vis[0][x][y-1]==inf){
                    vis[0][x][y-1] = nextCnt;
                    q.offer(new Node(0,x,y-1));
                }
                if(x+1<n && board[x+1][y]==0 && board[x+1][y+1]==0 && vis[0][x+1][y]==inf){
                    vis[0][x+1][y] = nextCnt;
                    q.offer(new Node(0,x+1,y));
                }
                if(x-1>=0 && board[x-1][y]==0 && board[x-1][y+1]==0 && vis[0][x-1][y]==inf){
                    vis[0][x-1][y] =  nextCnt;
                    q.offer(new Node(0,x-1,y));
                }
                if(x+1<n && board[x+1][y]==0 && board[x+1][y+1]==0 && vis[1][x][y+1]==inf){
                    vis[1][x][y+1] =  nextCnt;
                    q.offer(new Node(1,x,y+1));
                }
                if(x+1<n && board[x+1][y]==0 && board[x+1][y+1]==0 && vis[1][x][y]==inf){
                    vis[1][x][y] =  nextCnt;
                    q.offer(new Node(1,x,y));
                }
                if(x-1>=0 && board[x-1][y]==0 && board[x-1][y+1]==0 && vis[1][x-1][y+1]==inf){
                    vis[1][x-1][y+1] =  nextCnt;
                    q.offer(new Node(1,x-1,y+1));
                }
                if(x-1>=0 && board[x-1][y]==0 && board[x-1][y+1]==0 && vis[1][x-1][y]==inf){
                    vis[1][x-1][y] =  nextCnt;
                    q.offer(new Node(1,x-1,y));
                }
            }
            else{
                if(x+2<n && board[x+2][y]==0 && vis[1][x+1][y]==inf){
                    vis[1][x+1][y] = nextCnt;
                    q.offer(new Node(1,x+1,y));
                }
                if(x-1>=0 && board[x-1][y]==0 && vis[1][x-1][y]==inf){
                    vis[1][x-1][y] = nextCnt;
                    q.offer(new Node(1,x-1,y));
                }
                if(y+1<n && board[x][y+1]==0 && board[x+1][y+1]==0 && vis[1][x][y+1]==inf){
                    vis[1][x][y+1] = nextCnt;
                    q.offer(new Node(1,x,y+1));
                }
                if(y-1>=0 && board[x][y-1]==0 && board[x+1][y-1]==0 && vis[1][x][y-1]==inf){
                    vis[1][x][y-1] = nextCnt;
                    q.offer(new Node(1,x,y-1));
                }
                if(y+1<n && board[x][y+1]==0 && board[x+1][y+1]==0 && vis[0][x][y]==inf){
                    vis[0][x][y] = nextCnt;
                    q.offer(new Node(0,x,y));
                }
                if(y+1<n && board[x][y+1]==0 && board[x+1][y+1]==0 && vis[0][x+1][y]==inf){
                    vis[0][x+1][y] = nextCnt;
                    q.offer(new Node(0,x+1,y));
                }
                if(y-1>=0 && board[x][y-1]==0 && board[x+1][y-1]==0 && vis[0][x][y-1]==inf){
                    vis[0][x][y-1] = nextCnt;
                    q.offer(new Node(0,x,y-1));
                }
                if(y-1>=0 && board[x][y-1]==0 && board[x+1][y-1]==0 && vis[0][x+1][y-1]==inf){
                    vis[0][x+1][y-1] = nextCnt;
                    q.offer(new Node(0,x+1,y-1));
                }
            }
        }


        int answer = Math.min(vis[0][n-1][n-1-1],vis[1][n-1-1][n-1]);
        return answer;
    }
}

'Algorithm > Programmers' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Programmers] μ§€ν˜• 이동  (0) 2022.03.16
[Programmers] μžλ¬Όμ‡ μ™€ μ—΄μ‡ (2020 KAKAO BLIND RECRUITMENT)  (0) 2022.03.15