[프로그래머스]level2 - 게임 맵 최단거리(js/python)

swanious·2021년 7월 1일
0
post-custom-banner

문제 설명

나의 코드

  • python
from collections import deque

def solution(maps):
    answer = 0
    # 행/열 길이
    n, m = len(maps), len(maps[0])
    
    # 방향
    dy, dx = [1, 0, -1, 0], [0, 1, 0, -1]
    
    # 방문 배열
    visit = [[False] * m for _ in range(n)]
    visit[0][0] = True
    
    # queue 생성
    q = deque()
    q.append((0, 0, 1))
    
    while q:
        y, x, cnt = q.popleft()
        # 도착지에 도착했으면 break
        if y == n-1 and x == m-1:
            answer = cnt
            break
            
        for i in range(4):
            # 클론 생성 !
            ny, nx = y + dy[i], x + dx[i]
            # 1. 사방 체크하고,
            if ny >= 0 and ny < n and nx >= 0 and nx < m:
                # 2. 장애물/방문체크 후 갈 수 있으면,
                if not visit[ny][nx] and maps[ny][nx]:
                    # 3. 방명록 쓰고, 큐에 넣고
                    visit[ny][nx] = True
                    q.append((ny, nx, cnt + 1))
    
    # 도착지에 못갔으면 -1 반환하고, 아니면 답 반환
    if not visit[n-1][m-1]:
        return -1
    return answer
  • javascript
function solution(maps) {
    var answer = 0;
    
    // n, m
    const n = maps.length;
    const m = maps[0].length;
    
    // 방향
    const dy = [1, 0, -1, 0];
    const dx = [0, 1, 0, -1];
    
    // queue와 visit 배열 초기화
    let q = [];
    const visit = Array.from(Array(n), () => Array(m).fill(false));
    visit[0][0] = true;
    
    // y, x, 거리
    q.push([0, 0, 1])
    
    // bfs 시작
    while (q.length > 0) {
        let [y, x, d] = q.shift();
        if (y === n - 1 && x === m - 1) {
            answer = d;
            break;
        }
        // 4방향 체크
        for (let i = 0; i < 4; i++) {
            // 미리 가볼 분신들
            let ny = y + dy[i];
            let nx = x + dx[i];
            // 분신이 벽 / 장애물 / 방문체크하고 갈 수 있으면,
            if (ny >= 0 && ny < n && nx >= 0 && nx < m && maps[ny][nx] === 1 && !visit[ny][nx]) {
              	// 갈 곳 방문체크, q에 넣어주기
                visit[ny][nx] = true;
                q.push([ny, nx, d + 1]);
            }
        }
    }
    
    // n-1, m-1위치(상대방 진영)에 방문하지 않았으면 -1 반환하고, 아니면 answer반환 
    return !visit[n-1][m-1] ? -1 : answer
}

js로 풀다가 python으로 풀면 습관적으로 ;가 들어가버린다..

profile
TIL 기록을 위한 블로그
post-custom-banner

0개의 댓글