jinux127
Jinux
jinux127
  • 분류 전체보기 (109)
    • 엘리스 SW 엔지니어 트랙 (6)
      • TIL (6)
    • 개발지식 (22)
      • React (4)
      • JavaScript (9)
      • Web (4)
      • Node.js (1)
      • TypeScript (4)
    • 알고리즘 (69)
      • 백준 (47)
      • 프로그래머스 (14)
      • 이것이 코딩테스트다 (6)
    • 프로젝트 (10)
      • PHOTOCALENDAR (3)
      • 빙수먹을래? (7)
    • Life (0)
      • 헬스 (0)
      • 독서 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 블로그 이전

인기 글

태그

  • 문법
  • 알고리즘
  • 구현
  • node.js
  • 그리디
  • CSS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jinux127

Jinux

알고리즘/백준

[boj 16929] Two Dots -js

2022. 3. 17. 14:23
// Two Dots

const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
const input = require('fs').readFileSync(filePath).toString().trim().split(/\n/);

const sol = (input) =>{
    const [N,M] = input.shift().split(' ').map(Number);
    const visited = Array.from(Array(N),()=>new Array(M).fill(false));
    const map = [];
    const dx = [0,0,-1,1];
    const dy = [1,-1,0,0];
    let start;
    let flag = false;
    for(let i=0; i<input.length; i++){
        map.push(input[i].split(''));
    }

    const dfs = (x,y,cnt,type) =>{
        if(flag) return;

        for(let i=0; i<4; i++){
            const nx = x+dx[i];
            const ny = y+dy[i];
            if(cnt>=4 && start[0] === nx && start[1] === ny){
                flag = true;
                return;
            }

            if(nx<0||ny<0||nx>=M||ny>=N||type !== map[ny][nx] || visited[ny][nx] === true){
                continue;
            }
        
            visited[y][x] = true;
            dfs(nx,ny,cnt+1,type);
            visited[y][x] = false;

        }
    }
    Out:for(let y=0; y<N;y++){
        for(let x=0; x<M;x++){
            start = [x,y];
            const type = map[y][x];

            dfs(x,y,1,type);
            visited[y][x] = false;
            if(flag) break Out;
            
        }
    }

    flag ? console.log("Yes") : console.log("No");
}

sol(input);

먼저 사이클을 찾는 dfs를 학습하고 오는것이 좋다.

 

사이클을 찾는 dfs의 원리는 쉽게 말하자면 dfs로 그래프를 탐색하면서 중복된 좌표가 탐색될 경우가 사이클이 있는 그래프이다.

또, 사이클의 조건을 주의한다.

 

이 문제의 경우 4개의 좌표를 가져야하는 사이클이다. 그러므로 좌표를 세는 카운트가 4이상이 될 경우와 이동 좌표가 처음 좌표와 같을 경우를 찾으면 된다. 하지만 방문처리를하며 비교할때 처음 시작하는 좌표의 값을 방문처리 하기 때문에 비교가 안되어 원하는 대로 동작을 안할 수가 있다. 이 부분을 주의하면 된다.

 

 

아 그리고 문법의 사소한 실수를 하며 한참을 헤맸는데

var ttt = [1,2,3];
console.log(ttt === [1,2,3]) // ?

이 콘솔의 출력은 무엇일까.. 바보같은 실수를 했다.

'알고리즘 > 백준' 카테고리의 다른 글

[boj 14888] 연산자 끼워넣기 -js  (0) 2022.03.24
[boj 2675] 문자열 반복 - js  (0) 2022.03.19
[boj 7576] 토마토 -js  (0) 2022.03.14
[boj 2178] 미로탐색 -js  (0) 2022.03.14
[boj 2178] 섬의 개수 -js  (0) 2022.03.13
jinux127
jinux127

티스토리툴바