코테/lvl2

프로그래머스 리코쳇 로봇(lvl2) 풀어보기

디비드킴 2026. 9. 17. 11:14

문제링크

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

 


문제 핵심

게임판 위의 장애물이나 게임판 가장자리까지 부딪힐 때까지 미끄러져 움직이는 것을 한 번의 이동으로 정의합니다.

다음은 보드게임판을 나타낸 예시입니다. ("."은 빈 공간을, "R"은 로봇의 처음 위치를, "D"는 장애물의 위치를, "G"는 목표지점을 나타냅니다.)

말이 목표위치에 도달하는데 최소 몇 번 이동해야 하는지 return 하는 solution함수를 완성해주세요. 만약 목표위치에 도달할 수 없다면 -1을 return 해주세요.


알고리즘

-상하좌우로 d가 나오거나 끝에 닿을때까지 쭉가기

d가나오면 전칸이 g인지 확인하기 

끝에 닿으면  해당칸이 g인지 확인하기

둘다 아니라면 횟수 1증가 하고 방문 처리하기

반복 


코드

  public static int solution(String[] board) {
        int answer = 0;
        String[][] map = new String[board.length][board[0].length()];
        Integer[] start = new Integer[2];
        Integer[] arrive = new Integer[2];
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length(); j++) {
                map[i][j] = String.valueOf(board[i].charAt(j));
                if (map[i][j].equals("R")) {
                    start[0] = i;
                    start[1] = j;
                } else if (map[i][j].equals("G")) {
                    arrive[0] = i;
                    arrive[1] = j;
                }
            }
        }
        Arrays.stream(map).forEach(row -> System.out.println(Arrays.toString(row)));
        System.out.println("start:" + Arrays.toString(start) + " arrive:" + Arrays.toString(arrive));
        answer = bfs(start, map, arrive);
        System.out.println(answer);
        return answer;
    }

    public static int bfs(Integer[] start, String[][] map, Integer[] arrvi) {
        int count = -1;
        int mw = map[0].length;
        int mh = map.length;
        boolean[][] visited = new boolean[map.length][map[0].length];
        System.out.println("맵사이즈: " + mw + "," + mh);
        Queue<Integer[]> queue = new LinkedList<>();
        queue.offer(new Integer[] { start[0], start[1], 0 });
        visited[start[0]][start[1]] = true;
        printvisit(visited);
        boolean arrive = false;
        outer: while (!queue.isEmpty()) {
            System.out.println("위치 탐색 예정 큐" +
                    queue.stream()
                            .map(Arrays::toString)
                            .toList());
            Integer[] index = queue.poll();
            Integer wid = index[1];
            Integer hig = index[0];
            System.out.println("현재좌표: " + hig + "," + wid + ",움직임: " + index[2]);
            Integer right = wid + 1;
            Integer left = wid - 1;
            Integer up = hig - 1;
            Integer down = hig + 1;
            System.out.println("전진예정좌표: 오른쪽(" + hig + "," + right + ") 왼쪽(" + hig + "," + left + ") 위(" + up + "," + wid
                    + ") 아래(" + down + "," + wid + ")");
            if (right <= mw - 1) {
                for (int i = right; i <= mw - 1; i++) {
                    System.out.println("오른쪽전진: " + hig + "," + i);
                    String flg = map[hig][i];
                    System.out.println("전진값: " + flg);
                    if (flg.equals("D")) {
                        System.out.println("D에 막힘");
                        if (map[hig][i - 1].equals("G")) {
                            System.out.println("D바로앞 arrvi에도착");
                            arrive = true;
                            count = index[2] + 1;
                            System.out.println("총움직임: " + count);
                            break outer;
                        } else if (!visited[hig][i - 1]) {
                            visited[hig][i - 1] = true;
                            queue.offer(new Integer[] { hig, i - 1, index[2] + 1 });
                        }
                        break;
                    } else if (!flg.equals("D")) {
                        if (i == mw - 1 && flg.equals("G")) {
                            System.out.println("끝에arrvi있으므로도착");
                            arrive = true;
                            count = index[2] + 1;
                            System.out.println("총움직임: " + count);

                            break outer;
                        } else if (i == mw - 1) {
                            System.out.println("끝에도착");
                            if (!visited[hig][i]) {
                                visited[hig][i] = true;
                                printvisit(visited);
                                queue.offer(new Integer[] { hig, i, index[2] + 1 });
                            }
                            break;
                        }

                    }
                }
            }
            if (left >= 0) {
                for (int i = left; i >= 0; i--) {
                    System.out.println("왼쪽전진: " + hig + "," + i);
                    String flg = map[hig][i];
                    System.out.println("전진값: " + flg);
                    if (flg.equals("D")) {
                        System.out.println("D에 막힘");
                        if (map[hig][i + 1].equals("G")) {
                            System.out.println("D바로앞 arrvi에도착");
                            arrive = true;
                            count = index[2] + 1;
                            System.out.println("총움직임: " + count);

                            break outer;
                        } else if (!visited[hig][i + 1]) {
                            visited[hig][i + 1] = true;
                            queue.offer(new Integer[] { hig, i + 1, index[2] + 1 });
                        }
                        break;
                    } else if (!flg.equals("D")) {
                        if (i == 0 && flg.equals("G")) {
                            System.out.println("끝에arrvi있으므로도착");
                            arrive = true;
                            count = index[2] + 1;
                            System.out.println("총움직임: " + count);

                            break outer;
                        } else if (i == 0) {
                            System.out.println("끝에도착");
                            if (!visited[hig][i]) {
                                visited[hig][i] = true;
                                printvisit(visited);
                                queue.offer(new Integer[] { hig, i, index[2] + 1 });
                            }
                            break;
                        }

                    }
                }
            }
            if (up >= 0) {
                for (int i = up; i >= 0; i--) {
                    System.out.println("위쪽전진: " + i + "," + wid);
                    String flg = map[i][wid];
                    System.out.println("전진값: " + flg);
                    if (flg.equals("D")) {
                        System.out.println("D에 막힘");
                        if (map[i + 1][wid].equals("G")) {
                            System.out.println("D바로앞 arrvi에도착");
                            arrive = true;
                             count = index[2] + 1;
                            System.out.println("총움직임: " + count);

                            break outer;
                        } else if (!visited[i + 1][wid]) {
                            visited[i + 1][wid] = true;
                            queue.offer(new Integer[] { i + 1, wid, index[2] + 1 });
                        }
                        break;
                    } else if (!flg.equals("D")) {
                        if (i == 0 && flg.equals("G")) {
                            System.out.println("끝에arrvi있으므로도착");
                            arrive = true;
                            count = index[2] + 1;
                            System.out.println("총움직임: " + count);
                            break outer;
                        } else if (i == 0) {
                            System.out.println("끝에도착");
                            if (!visited[i][wid]) {
                                visited[i][wid] = true;
                                printvisit(visited);
                                queue.offer(new Integer[] { i, wid, index[2] + 1 });
                            }
                            break;
                        }

                    }
                }
            }
            if (down <= mh - 1) {
                for (int i = down; i <= mh - 1; i++) {
                    System.out.println("아래쪽전진: " + i + "," + wid);
                    String flg = map[i][wid];
                    System.out.println("전진값: " + flg);
                    if (flg.equals("D")) {
                        System.out.println("D에 막힘");
                        if (map[i - 1][wid].equals("G")) {
                            System.out.println("D바로앞 arrvi에도착");
                            arrive = true;
                            count = index[2] + 1;
                            System.out.println("총움직임: " + count);

                            break outer;
                        } else if (!visited[i - 1][wid]) {
                            visited[i - 1][wid] = true;
                            queue.offer(new Integer[] { i - 1, wid, index[2] + 1 });
                        }
                        break;
                    } else if (!flg.equals("D")) {
                        if (i == mh - 1 && flg.equals("G")) {
                            System.out.println("끝에arrvi있으므로도착");
                            arrive = true;
                            count = index[2] + 1;
                            System.out.println("총움직임: " + count);

                            break outer;
                        } else if (i == mh - 1) {
                            System.out.println("끝에도착");
                            if (!visited[i][wid]) {
                                visited[i][wid] = true;
                                printvisit(visited);
                                queue.offer(new Integer[] { i, wid, index[2] + 1 });

                            }
                            break;
                        }

                    }
                }
            }
        }
        if (!arrive) {
            return -1;
        }
        return count;
    }
public static void printvisit(boolean[][] visited) {
        System.out.println("visited 생성 시작");

        for (int i = 0; i < visited.length; i++) {
            for (int ii = 0; ii < visited[i].length; ii++) {
                System.out.print(visited[i][ii] + " ");
            }
            System.out.println();
        }

        System.out.println("visited 생성 종료");
    }

 


결과




gpt피드백

-딱히없다

 

배운점과느낀점

-새로운 bfs 문제였다

이전까지는 늘 한칸씩전진이였는데

이번에는 컬링같은 문제였다

다행이 금방 어떻게 풀어야 할지 감을 잡았다