Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

연습장/프로그래머스 문제풀이

[프로그래머스 Level 2] 게임 맵 최단거리 - JavaScript

2022. 5. 9. 12:08

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/1844

 

코딩테스트 연습 - 게임 맵 최단거리

[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

programmers.co.kr

풀이

function solution(maps) {
    const xLength = maps.length;
    const yLength = maps[0].length;
    const dx = [0, 0, -1, 1];
    const dy = [-1, 1, 0, 0];
    
    const bfs = () => {
        const queue = [[0, 0, 1]];
        while (queue.length) {
            const [x, y, count] = queue.shift();
            if (x === xLength - 1 && y === yLength - 1) {
                return count;
            }
            if (maps[x][y]) {
                maps[x][y] = 0;
                dx.forEach((dx, i) => {
                    const nx = x + dx;
                    const ny = y + dy[i];
                    if (nx >= 0 && nx < xLength && ny >= 0 && ny < yLength && maps[nx][ny]) {
                        queue.push([nx, ny, count + 1]);
                    }
                });
            }
        }
        return -1;
    };
    return bfs();
}

 

너비 우선 탐색을 통해 상대 팀 진영으로 가는 최단 거리를 구할 수 있다.

 

큐에 [x좌표, y좌표, 움직인 칸 수]를 push하는 방식으로 해당 좌표까지 오는데 움직인 최소 칸 수를 얻어낼 수 있다.

벽이 아닌 칸만 갈 수 있으므로 if문 조건에 maps[nx][ny]를 넣어 0이 아닌 경우에만 큐에 push하도록 하였다.

 

최종적으로 x, y좌표가 상대 팀 진영과 같을 때 그 때 count(움직인 칸 수)가 상대 팀 진영으로 가는 최단거리이다.

만약 while문을 그냥 빠져나왔다면 모든 이동 가능한 칸을 다 방문했음에도 상대 팀 진영에 도달하지 못한 것이므로, -1을 반환하도록 하였다.

 

처음에는 visited 배열을 만들어서 방문 여부를 2차원 배열에 boolean을 담아서 표시하였으나, 효율성 테스트 3에서 시간 초과가 났다. 그래서 visited 배열을 따로 만들지 않고, 원본 maps의 칸을 1에서 0으로 변경시키는 방법으로 하였더니 통과하였다. 

저작자표시 비영리 (새창열림)

'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글

[프로그래머스 DFS/BFS] 타겟 넘버 - JavaScript  (0) 2022.05.10
[프로그래머스 Level 2] 거리두기 확인하기 - JavaScript  (0) 2022.05.09
[프로그래머스 Level 1] [1차] 비밀지도 - JavaScript  (0) 2022.05.06
[프로그래머스 Level 1] 신규 아이디 추천 - JavaScript  (0) 2022.04.23
[프로그래머스 Level 3] 다단계 칫솔 판매 - JavaScript  (0) 2022.04.11
    '연습장/프로그래머스 문제풀이' 카테고리의 다른 글
    • [프로그래머스 DFS/BFS] 타겟 넘버 - JavaScript
    • [프로그래머스 Level 2] 거리두기 확인하기 - JavaScript
    • [프로그래머스 Level 1] [1차] 비밀지도 - JavaScript
    • [프로그래머스 Level 1] 신규 아이디 추천 - JavaScript
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바