Pepperminttt
Pepperminttt's Dev
Pepperminttt
전체 방문자
오늘
어제
  • devInfo (86)
    • forBeingGoodDeveloper (2)
    • React (2)
      • LostArk Open API (1)
    • algorithm (58)
      • problems (44)
      • theory (14)
    • computerScience (8)
      • network (8)
    • javaScript (8)
    • Java (4)
    • web (2)
      • webApplication (2)
    • etc. (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • 그래프
  • 탐욕법 문제
  • node.js
  • Network
  • dfs문제
  • C++
  • solved.ac
  • greedy
  • BFS
  • dfs
  • DP문제
  • 프로그래머스
  • 벨만-포드
  • bfs문제
  • Java
  • JavaScript
  • DP
  • 알고리즘
  • 탐욕법

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Pepperminttt

Pepperminttt's Dev

[백준] 2178번 미로 탐색
algorithm/problems

[백준] 2178번 미로 탐색

2022. 11. 7. 18:24

문제

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

 


문제 풀이

 해당 문제는 처음에 DFS로 시도하였다. 하지만 시간초과가 나왔다. 미로의 최대 크기는 100X100 사이즈이므로 DFS나 완전 탐색으로 풀이 할 경우 시간 초과가 뜬다.

 

이 후 BFS로 풀이를 하였다.

 

DFS는 queue의 현재 위치를 shift하여 해당 점에서 움직일 수 있는 모든 방향을 queue에 추가한다. 이 때 막히거나 방문한 곳은 push하지 않는다.

 

더해서 맵과 같은 크기의 이중 배열 visited에 방문한 곳을 최단 기록을 넣어준다.(방문하지 않은 곳은 0)

 

시작 점은 (1,1)로 고정이다. queue에 (1,1)을 넣고 DFS를 실행하면 아래와 같은 결과가 나오고 도착 지점의 visited array의 값을 출력해준다.

 

위 그림 순서와 같이 시작하여 visited를 업데이트 시켜준다.


위 그림과 같이 완성 할 수 있다.

 

const fs = require('fs');
const stdin = (process.platform === 'linux'? fs.readFileSync('/dev/stdin').toString() :
`7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111`).split('\n');

const input = (() => {
    let line = 0;
    return () => stdin[line++];
})();


function solution(){
    let answer = Number.MAX_VALUE;
    let data = [];
    let [N,M] = input().split(' ').map((v)=>+v);
    let pos = [0,0];
    let count = 0;
    for(let i = 0; i < N; i++){
        data.push(input().split('').map((v)=>+v));
    }
    // console.table(data);

    const DFS = (pos,count) =>{
        if(pos[0]=== N - 1 && pos[1] === M -1){
            answer = answer > count + 1 ? count+1 : answer;
            return
        }
        // console.log(pos);
        // console.table(data);
        if(pos[0] < N - 1){
            if(data[pos[0]+1][pos[1]]===1){
                data[pos[0]][pos[1]] = 2;
                DFS([pos[0]+1,pos[1]],count + 1);
                data[pos[0]][pos[1]] = 1;
            }
        }
        if(pos[1] < M - 1){
            if(data[pos[0]][pos[1]+1]===1){
                data[pos[0]][pos[1]] = 2;
                DFS([pos[0],pos[1]+1],count + 1);
                data[pos[0]][pos[1]] = 1;
            }
        }
        if(pos[0] > 0){
            if(data[pos[0]-1][pos[1]]===1){
                data[pos[0]][pos[1]] = 2;
                DFS([pos[0]-1,pos[1]],count + 1);
                data[pos[0]][pos[1]] = 1;
            }
        }
        if(pos[1] > 0){
            if(data[pos[0]][pos[1]-1]===1){
                data[pos[0]][pos[1]] = 2;
                DFS([pos[0],pos[1]-1],count + 1);
                data[pos[0]][pos[1]] = 1;
            }
        }
    }

    DFS(pos,0);
    console.log(answer);
}

solution();

'algorithm > problems' 카테고리의 다른 글

[백준] 14226번 이모티콘 - Node.js  (0) 2022.11.13
[백준] 1697번 숨바꼭질 _ Node.js  (0) 2022.11.12
[백준] 15988번 1, 2, 3 더하기 3  (0) 2022.11.07
[백준] 14888번 연산자 끼워넣기  (0) 2022.11.07
[Programmers]큰 수 만들기  (0) 2022.11.05
    'algorithm/problems' 카테고리의 다른 글
    • [백준] 1697번 숨바꼭질 _ Node.js
    • [백준] 15988번 1, 2, 3 더하기 3
    • [백준] 14888번 연산자 끼워넣기
    • [Programmers]큰 수 만들기
    Pepperminttt
    Pepperminttt
    HTML, JavaScript, Python 등 Computer language TIL

    티스토리툴바