본문 바로가기

코딩 문제/백준

백준 - 13460번

728x90

풀이

 

import java.io.*;

import java.util.LinkedList;

import java.util.Queue;

 

public class Main {

      static int[][] rboArea = {{0, 0}, {0, 0}, {0, 0}}; // R, B, O 위치 값

      static int x = 0, y = 0; // 입력받은 열, 행

      static String[][] arr = null; // 입력받은 배열

      static boolean[][][][] visited = null; // 방문 배열

      static int[][] drFlow = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 열/행 증/감 배열

 

      public static void main(String[] args) throws Exception {

            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 

            String[] inputList = br.readLine().split(" ");

            x = Integer.parseInt(inputList[0]); // 열 Setting

            y = Integer.parseInt(inputList[1]); // 행 Setting

            arr = new String[x][y];

            visited = new boolean[x][y][x][y];

 

            for(int i=0; i<x; i++) {

                  makeArr(br.readLine(), i);

            }

 

            System.out.print(findRode());

 

            br.close();

      }

 

      // 입력받은 데이터로 배열 생성 함수

      private static void makeArr(String str, int num) {

            int chkR = str.indexOf("R"); // R 위치

            int chkB = str.indexOf("B"); // B 위치

            int chkO = str.indexOf("O"); // O 위치

 

            if(chkR != -1) {

                  rboArea[0][0] = num;

                  rboArea[0][1] = chkR;

            }

 

            if(chkB != -1) {

                  rboArea[1][0] = num;

                  rboArea[1][1] = chkB;

            }

 

            if(chkO != -1) {

                  rboArea[2][0] = num;

                  rboArea[2][1] = chkO;

            }

 

            arr[num] = str.split("");

      }

 

      // 최단 경로 찾기

      private static int findRode() {

            Queue<Node> q = new LinkedList<>();

            q.add(new Node(rboArea[0][0], rboArea[0][1], rboArea[1][0], rboArea[1][1], 1));

 

            while(!q.isEmpty()) {

                  Node node = q.poll();

                  int originRX = node.rX, originRY = node.rY; // R의 위치

                  int originBX = node.bX, originBY = node.bY; // B의 위치

                  int depth = node.depth;

 

                  visited[originRX][originRY][originBX][originBY] = true;

 

                  if(depth > 10) return -1; // 10회 넘으면 실패

 

                  for(int i=0; i<4; i++) {

                        int moveX = drFlow[i][0];

                        int moveY = drFlow[i][1];

                        int rX = node.rX, rY = node.rY; // 기울였을 때 R의 위치

                        int bX = node.bX, bY = node.bY; // 기울였을 때 B의 위치

 

                        boolean rIn = false, bIn = false; // R과 B가 O 에 들어갔는지 체크

 

                        while(!arr[rX + moveX][rY + moveY].equals("#")) { // 벽이 나올 때까지 R 이동

                              if(arr[rX + moveX][rY + moveY].equals("O")) {

                                    rIn = true;

                                    break;

                              }

                              rX += moveX;

                              rY += moveY;

                        }

 

                        while(!arr[bX + moveX][bY + moveY].equals("#")) { // 벽이 나올 때까지 B 이동

                              if(arr[bX + moveX][bY + moveY].equals("O")) {

                                    bIn = true;

                                    break;

                              }

                              bX += moveX;

                              bY += moveY;

                        }

 

                        if(bIn) {

                              continue;

                        } else if(rIn) {

                              return depth;

                        }

 

                        // R과 B 위치가 같은 경우

                        if(rX == bX && rY == bY) {

                              if(i == 0) { // 위

                                    if(originRX < originBX) {

                                          bX++;

                                    } else {

                                          rX++;

                                    }

                              } else if(i == 1) { // 아래

                                    if(originRX < originBX) {

                                          rX--;

                                    } else {

                                          bX--;

                                    }

                              } else if(i == 2) { // 왼쪽

                                    if(originRY < originBY) {

                                          bY++;

                                    } else {

                                          rY++;

                                    }

                              } else if(i == 3) { // 오른쪽

                                    if(originRY < originBY) {

                                          rY--;

                                    } else {

                                          bY--;

                                    }

                              }

                        }

 

                        if(!visited[rX][rY][bX][bY]) {

                              q.add(new Node(rX, rY, bX, bY, depth+1));

                              visited[rX][rY][bX][bY] = true;

                        }

                  }

            }

 

            return -1;

      }

}

 

class Node {

      int rX, rY; // R 위치

      int bX, bY; // B 위치

      int depth; // 횟수

 

      Node(int _rX, int _rY, int _bX, int _bY, int _depth) {

            this.rX = _rX;

            this.rY = _rY;

            this.bX = _bX;

            this.bY = _bY;

            this.depth = _depth;

      }

}

'코딩 문제 > 백준' 카테고리의 다른 글

백준 - 26004번  (0) 2024.03.10
백준 - 7576번  (1) 2024.02.25
백준 - 28086번  (0) 2023.06.18
백준 - 16437번  (1) 2021.03.25
백준 - 1987번  (0) 2021.03.25