Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        
                    | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                            Tags
                            
                        
                          
                          - 토이프로젝트
 - 딥러닝
 - JavaScript
 - 현대
 - 소프티어
 - Algorithm
 - 현대자동차
 - alogorithm
 - cs공부
 - Java
 - softeer
 - 파이썬
 - heapq
 - GAN
 - 자바
 - 힙큐
 - 알고리즘
 - 탐욕법
 - cim
 - 자바스크립트
 - re_lunchu
 - programmers
 - Python
 - Baekjoon
 - 프로그래머스
 - 백준
 - 오블완
 - boj
 - 티스토리챌린지
 - 스마트팩토리
 
                            Archives
                            
                        
                          
                          - Today
 
- Total
 
eaz_coding
[Programmers] 미로 탈출(Python, Javascript, Java) 본문
문제
요약
시작지점에서 레버에 들렸다가 탈출지점까지 가는 최소 시간을 구해라.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
Python
from collections import deque
def solution(maps):
    n, m = len(maps), len(maps[0])
    start = (0, 0)
    end = (n-1, m-1)
    lever = (1, 1)
    
    for i in range(n):
        for j in range(m):
            if maps[i][j] == "S":
                start = (i, j)
            elif maps[i][j] == "E":
                end = (i, j)
            elif maps[i][j] == "L":
                lever = (i, j)
    
    directions = [(-1,0), (1,0), (0,-1), (0,1)]
    
    def bfs(stack, goal):
        visited = [[-1] * m for _ in range(n)]
        visited[stack[0][0]][stack[0][1]] = 0
        gx, gy = goal
        
        while stack:
            x, y = stack.popleft()
            for dx, dy in directions:
                nx = x+dx
                ny = y+dy
                
                if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == -1 and maps[nx][ny] != "X":
                    stack.append((nx, ny))
                    visited[nx][ny] = visited[x][y] + 1
        return visited[gx][gy]
    
    stol = bfs(deque([start]), lever)
    if stol != -1:
        ltoe = bfs(deque([lever]), end)
        if ltoe != -1:
            return stol+ltoe
        
    return -1
Javascript
function solution(maps) {
    const n = maps.length;
    const m = maps[0].length;
    
    let start = [0,0];
    let lever = [1, 1];
    let end = [n, m];
    
    for (let i = 0; i < n; i++){
        for (let j = 0; j < m; j++){
            if (maps[i][j] === "S"){
                start = [i, j];
            } else if (maps[i][j] === "L"){
                lever = [i, j];
            } else if (maps[i][j] === "E"){
                end = [i, j];
            }
        }
    }
    
    const d = [[-1,0], [1,0], [0,-1], [0,1]]
    
    function bfs(stack, gx, gy){
        let visited = Array.from(Array(n), () => Array(m).fill(-1));
        visited[stack[0][0]][stack[0][1]] = 0
        while (stack.length) {
            const [x, y] = stack.shift();
            for (let i = 0; i < 4; i++) {
                const nx = x + d[i][0];
                const ny = y + d[i][1];
                if (0 <= nx && nx < n && 0 <= ny && ny < m && visited[nx][ny] === -1 && maps[nx][ny] != "X") {
                    stack.push([nx, ny])
                    visited[nx][ny] = visited[x][y] + 1
                }
            }
        }
        return visited[gx][gy];
    }
    
    const stol = bfs([start], lever[0], lever[1]);
    if (stol != -1){
        const ltoe = bfs([lever], end[0], end[1]);
        if (ltoe != -1){
            return stol + ltoe;
        }
    }
    
    return -1;
}
Java
큐에 값이 배열로 들어갈 때는 LinkedList가 아니라 ArrayDeque를 통해서 구현한다.
import java.util.*;
class Solution {
    int n;
    int m;
    int[][] d = {{-1, 0}, {1,0}, {0,-1},{0,1}};
    
    public int bfs(int[][] lst,int gx, int gy, String[] maps){
        int[][] visited = new int[n][m];
        
        Queue<int[]> q = new ArrayDeque<>();
        for (int[] v : lst) {
            q.offer(v);
            visited[v[0]][v[1]] = 1;   
        }
        
        while (!q.isEmpty()){
            int[] now = q.remove();
            
            for (int i = 0; i < 4; i++){
                int nx = now[0] + d[i][0];
                int ny = now[1] + d[i][1];
                
                if (0 <= nx && nx < n && 0 <= ny && ny < m && visited[nx][ny] == 0 && maps[nx].charAt(ny) != 'X'){
                    int[] t = {nx, ny};
                    q.offer(t);
                    visited[nx][ny] = visited[now[0]][now[1]] + 1;
                }
            }
        }
        return visited[gx][gy] - 1;
    }
    
    public int solution(String[] maps) {
        n = maps.length;
        m = maps[0].length();
        
        int[][] start = new int[1][2];
        int[][] end = new int[1][2];
        int[][] lever = new int[1][2];
        for (int i = 0; i < n; i++){
            for (int j = 0; j < m; j++){
                if (maps[i].charAt(j) == 'S'){
                    start[0][0] = i;
                    start[0][1] = j;
                } else if (maps[i].charAt(j) == 'E'){
                    end[0][0] = i;
                    end[0][1] = j;
                } else if (maps[i].charAt(j) == 'L'){
                    lever[0][0] = i;
                    lever[0][1] = j;
                }
            }
        }
        
        int StoL = bfs(start, lever[0][0], lever[0][1], maps);
        if (StoL != -1){
            int LtoE = bfs(lever, end[0][0], end[0][1], maps);
            if (LtoE !=-1){
                return StoL + LtoE;
            }
        }
        return -1;
    }
}
'eaz_algorithm' 카테고리의 다른 글
| [Programmers] 리코쳇 로봇(Python, Javascript) (1) | 2024.06.18 | 
|---|---|
| [Programmers] 테이블 해시 함수(Python, Javascript) (0) | 2024.06.17 | 
| [Programmers] 행렬 테두리 회전하기(Python, Javascript, Java) (0) | 2024.06.07 | 
| [Programmers] 수식 최대화(Javascript) (0) | 2024.06.06 | 
| [Programmers] 괄호 변환(Javascript) (0) | 2024.06.05 |