https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
미로를 탈출하는데 레버에 먼저 들리고 출구로 가야한다. 
즉, 출발지 -> 레버, 레버 -> 출구 2차례 그래프 탐색으로 최솟값을 구하면 된다. 
bfs탐색을 통해 두 함수의 최솟값을 구해줬다.
메모리: 77.3MB
시간: 0.42ms
언어: Java 11
import java.util.*;
class Solution {
    static class Point {
        int r;
        int c;
        int time;
        public Point(int r, int c, int time) {
            this.r = r;
            this.c = c;
            this.time = time;
        }
    }
    static char[][] board;
    static int answer;
    static int[][] vector = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
    public int solution(String[] maps) {
        board = new char[maps.length][maps[0].length()];
        int sr = 0;
        int sc = 0;
        for (int i = 0; i < maps.length; i++) {
            for (int j = 0; j < maps[0].length(); j++) {
                board[i][j] = maps[i].charAt(j);
                if (board[i][j] == 'S') {
                    sr = i;
                    sc = j;
                }
            }
        }
        answer = findRoute(sr, sc, 'L');
        return answer;
    }
    private static int findRoute(int r, int c, char goal) {
        Queue<Point> queue = new LinkedList<>();
        boolean[][] visit = new boolean[board.length][board[0].length];
        visit[r][c] = true;
        queue.add(new Point(r, c, 0));
        while (!queue.isEmpty()) {
            Point curr = queue.poll();
            if (board[curr.r][curr.c] == goal) {
                if (goal == 'L') {
                    int f = findRoute(curr.r, curr.c, 'E');
                    if (f == -1) {
                        return -1;
                    } else {
                        return curr.time + f;
                    }
                } else {
                    return curr.time;
                }
            }
            for (int i = 0; i < 4; i++) {
                int nr = curr.r + vector[i][0];
                int nc = curr.c + vector[i][1];
                if (nr < 0 || nc < 0 || nr >= board.length || nc >= board[0].length || board[nr][nc] == 'X'
                        || visit[nr][nc]) {
                    continue;
                }
                queue.add(new Point(nr, nc, curr.time + 1));
                visit[nr][nc] = true;
            }
        }
        return -1;
    }
}'Algorithm > Programmers' 카테고리의 다른 글
| [프로그래머스] 카드 짝 맞추기 - JAVA (0) | 2024.05.18 | 
|---|---|
| [프로그래머스] 파괴되지 않은 건물 - JAVA (0) | 2024.05.18 | 
| [프로그래머스] 광고 삽입 - JAVA (0) | 2024.05.18 | 
| [프로그래머스] 블록 이동하기 - JAVA (0) | 2024.05.17 | 
| [프로그래머스] 마법의 엘리베이터 - JAVA (0) | 2024.05.17 | 
| [프로그래머스] [카카오 인턴] 경주로 건설 - JAVA (0) | 2024.05.12 |