[프로그래머스] PS/Java

[lv2] 리코쳇 로봇

SH3542 2024. 12. 15. 20:40

https://school.programmers.co.kr/learn/courses/30/lessons/169199

 

기본 bfs 문제에 델타를 1칸 이동 -> 갈 수 있는 데까지 이동으로 바꾼 형식이었다.

 

import java.util.*;

class Solution {
    public int solution(String[] board) {
        int answer = 0;
        int R = board.length;
        int C = board[0].length();
        int gr=0, gc=0, rr=0, rc=0;

        int[] dr = {0,0,1,-1};
        int[] dc = {1,-1,0,0};

        char[][] map = new char[R][C];
        boolean[][] vst = new boolean[R][C];

        for(int i=0; i<R; i++) {
            String b = board[i];
            for(int j=0; j<C; j++) {
                char c = b.charAt(j);
                map[i][j] = c;

                if(c == 'G') {
                    gr = i;
                    gc = j;
                }
                else if(c == 'R') {
                    rr = i;
                    rc = j;
                }
            }
        }

        Queue<int[]> q = new ArrayDeque<>();
        q.offer(new int[]{rr, rc, 0});
        vst[rr][rc] = true;

        while(!q.isEmpty()) {
            int[] info = q.poll();

            int r = info[0];
            int c = info[1];
            int m = info[2];

            if(r == gr && c == gc) {
                answer = m;
                break;
            }

            for(int i=0; i<4; i++) {
                int tr = r;
                int tc = c;

                switch(i) {
                    case 0 : {
                        while(tc + dc[i] < C && map[tr][tc + dc[i]] != 'D') {
                            tc += dc[i];
                        }
                        break;
                    }
                    case 1 : {
                        while(tc + dc[i] >= 0 && map[tr][tc + dc[i]] != 'D') {
                            tc += dc[i];
                        }
                        break;
                    }
                    case 2 : {
                        while(tr + dr[i] < R && map[tr + dr[i]][tc] != 'D') {
                            tr += dr[i];
                        }
                        break;
                    }
                    case 3 : {
                        while(tr + dr[i] >= 0 && map[tr + dr[i]][tc] != 'D') {
                            tr += dr[i];
                        }
                    }
                }

                if(!vst[tr][tc]) {
                    vst[tr][tc] = true;
                    q.offer(new int[]{tr,tc,m+1});
                }
            }
        }

        return answer == 0 ? -1 : answer;
    }
}

'[프로그래머스] PS > Java' 카테고리의 다른 글

[lv2] 파일명 정렬  (1) 2024.12.19
[lv3] 외벽 점검  (0) 2024.12.16
[lv2] 방금그곡  (0) 2024.12.15
[lv2] 줄 서는 방법  (1) 2024.12.15
[lv2] 배달  (0) 2024.12.13