(Java) 프로그래머스 - 미로 탈출

2023. 7. 22. 16:21·코딩 테스트

오랜만에 푸는 BFS 문제였다.

기본적인 BFS 문제에서 약간 더 생각을 해야했는데, 로직을 생각하는데 그리 오래 걸리지는 않았다.


로직

먼저, 탈출을 하기 위해서는 레버까지 가야한다.

그렇기 때문에 레버까지 BFS를 통해 최단거리 탐색을 진행한다.

레버에 도착하고 다시 한번 탈출지점까지 BFS 탐색을 하는데, 여기서 중요한것은 왔던길을 다시 갈 수도 있다는 것이다.

따라서 방문 배열을 초기화 하고 BFS 탐색을 진행해야 한다.

 

탈출 조건이 (시작지점에서 레버에 도달 && 레버에서 탈출지점까지 도달) 이므로 둘중 하나라도

만족하지 못하면 -1을 리턴해야 한다.

 

최종 코드

import java.util.*;

class Solution {

    static int[] dRow = {-1, 1, 0, 0};
    static int[] dCol = {0, 0, -1, 1};
    static int[] lever = new int[2];

    public int solution(String[] maps) {
        int answer = 0;
		
        // 탐색을 위한 2차원 배열과 방문 배열 초기화
        String[][] map = new String[maps.length][maps[0].length()];
        boolean[][] visited = new boolean[maps.length][maps[0].length()];
        int[] start = new int[2];
		
        // 2차원 배열을 만들며 최초 시작 위치 탐색
        for(int i = 0; i < maps.length; i++) {
            String[] temp = maps[i].split("");
            map[i] = temp;
            for(int j = 0; j < temp.length; j++) {
                if(temp[j].equals("S")) {
                    start[0] = i;
                    start[1] = j;
                }
            }
        }
		
        // 레버까지 BFS 탐색
        int first = bfs(map, visited, start, "L");
        if(first == -1) {
            return -1;
        }
		
        // 탈출지점까지 BFS 탐색
        visited = new boolean[maps.length][maps[0].length()];
        int second = bfs(map, visited, lever, "E");
        if(second == -1) {
            return -1;
        }
        
        answer = first + second;
        return answer;
    }

    public int bfs(String[][] map, boolean[][] visited, int[] start, String target) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{start[0], start[1], 0});
        visited[start[0]][start[1]] = true;

        while(!queue.isEmpty()) {
            int[] temp = queue.poll();
            int currentRow = temp[0];
            int currentCol = temp[1];
            int cnt = temp[2];

            for(int i = 0; i < 4; i++) {
                int newRow = currentRow + dRow[i];
                int newCol = currentCol + dCol[i];
                if(newRow >= 0 && newRow < map.length && newCol >= 0 && newCol < map[0].length) {
                    if(map[newRow][newCol].equals(target)) {
                        lever[0] = newRow;
                        lever[1] = newCol;
                        return cnt + 1;
                    }
                    if(!map[newRow][newCol].equals("X") && !visited[newRow][newCol]) {
                        visited[newRow][newCol] = true;
                        queue.add(new int[]{newRow, newCol, cnt + 1});
                    }
                }
            }
        }
        return -1;
    }
}
저작자표시 (새창열림)

'코딩 테스트' 카테고리의 다른 글

(Java) 프로그래머스 - 디펜스 게임  (0) 2023.07.29
(Java) 프로그래머스 - 광물 캐기  (0) 2023.07.25
(Java) 프로그래머스 - 테이블 해시 함수  (0) 2023.07.19
(Java) 프로그래머스 - 마법의 엘리베이터  (0) 2023.07.13
(Java) 프로그래머스 - 호텔 대실  (0) 2023.07.10
'코딩 테스트' 카테고리의 다른 글
  • (Java) 프로그래머스 - 디펜스 게임
  • (Java) 프로그래머스 - 광물 캐기
  • (Java) 프로그래머스 - 테이블 해시 함수
  • (Java) 프로그래머스 - 마법의 엘리베이터
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • YAPP
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 프로그래머스 - 미로 탈출
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.