블로그 메뉴

    Tonkatsu
    Developer Lee
    Tonkatsu
    전체 방문자
    오늘
    어제
    • 분류 전체보기 (52)
      • Frontend (7)
        • React (3)
        • JavaScript (3)
        • HTML\CSS (1)
        • etc (0)
      • Backend (0)
        • Python\Django (0)
        • etc (0)
      • CS (32)
        • Algorithm\Coding Test (19)
        • Computer Science (8)
        • devops (5)
        • etc (0)
      • Languages (5)
        • Javascript (5)
        • Python (0)
        • etc (0)
      • 비상다반 (3)
      • 학원 (4)

    인기 글

    태그

    • HTML
    • Push
    • js
    • 프론트엔드
    • javascript
    • 백준
    • 네트워크
    • 코딩테스트
    • 코테
    • 리트코드
    • 프로그래머스
    • BFS
    • fetch
    • CS
    • 자바스크립트
    • merge
    • leetcode
    • CSS
    • DFS
    • Git

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Tonkatsu

    Developer Lee

    백준 : 2178-javascript
    CS/Algorithm\Coding Test

    백준 : 2178-javascript

    2021. 12. 12. 08:50

    문제

    N×M크기의 배열로 표현되는 미로가 있다.

    1 0 1 1 1 1
    1 0 1 0 1 0
    1 0 1 0 1 1
    1 1 1 0 1 1

    미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

    위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

    입력

    첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

    출력

    첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

    예제 입력 1 복사

    4 6
    101111
    101010
    101011
    111011
    

    예제 출력 1 복사

    15

    예제 입력 2 복사

    4 6
    110110
    110110
    111111
    111101
    

    예제 출력 2 복사

    9
    

    예제 입력 3 복사

    2 25
    1011101110111011101110111
    1110111011101110111011101
    

    예제 출력 3 복사

    38
    

    예제 입력 4 복사

    7 7
    1011111
    1110001
    1000001
    1000001
    1000001
    1000001
    1111111
    

    예제 출력 4 복사

    13

     

    풀이

     

    최소 거리를 구하는 문제는 보통 BFS를 이용하여 푼다.

    따라서 2차원 배열을 사용한 BFS를 사용하면 풀 수 있는 문제이다.

     

    let inputs = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
    
    let size = inputs.shift().split(" ").map(Number);
    let n = size[0];
    let m = size[1];
    inputs = inputs.map((x) => x.split("").map(Number));
    
    let dx = [1, -1, 0, 0];
    let dy = [0, 0, 1, -1];
    let queue = [[0, 0]];
    let answer = 1;
    
    function BFS(x, y) {
      inputs[x][y] = 0;
      for (let i = 0; i < 4; i++) {
        let nx = x + dx[i];
        let ny = y + dy[i];
        if (nx >= 0 && nx < n && ny >= 0 && ny < m && inputs[nx][ny] === 1) {
          inputs[nx][ny] = 0;
          queue.push([nx, ny]);
        }
      }
    }
    
    outer: while (true) {
      let visited = queue;
      queue = [];
    
      for (let i of visited) {
        if (i[0] === n - 1 && i[1] === m - 1) {
          break outer;
        } else {
          BFS(...i);
        }
      }
      answer++;
    }
    
    console.log(answer);

     

    이번엔 재귀함수를 사용하지 않고 반복문을 사용하여 문제를 풀었다.

    재귀함수는 반복횟수에 한계가 있고 최소거리를 계산하기에도 조금 까다롭다.

    또한 개인적으로 재귀함수보다 반복문을 사용한 풀이가 알아보기 좋은 것 같다.

     

    저작자표시 (새창열림)

    'CS > Algorithm\Coding Test' 카테고리의 다른 글

    백준 : 7576-javascript  (0) 2021.12.18
    백준 : 11650-javascript  (0) 2021.12.17
    백준 : 2667-javascript  (0) 2021.12.10
    백준-1012-javascript  (2) 2021.12.06
    백준-1026-javascript  (1) 2021.11.30
      'CS/Algorithm\Coding Test' 카테고리의 다른 글
      • 백준 : 7576-javascript
      • 백준 : 11650-javascript
      • 백준 : 2667-javascript
      • 백준-1012-javascript
      Tonkatsu
      Tonkatsu
      한 번 뿐인 인생 편하게 살고싶지만 그러려면 열심히 살아야 되니까 열심히 살려고 노력은 하지만 편하게 사는 사람

      티스토리툴바