프로그래머스 Lv.2 무인도 여행

Kim Jason·2023년 4월 3일
0

알고리즘 노트

목록 보기
26/35
post-thumbnail

💁🏻 코드

function solution(maps) {
    let answer = [];
    // ✅ 문자열을 모두 숫자로 바꿔준다
    maps = maps
        .map(x => x.split('').map(y => {
        if (y === 'X') return 0;
        else return +y;
    }));
    // ✅ 행과 열의 개수
    const [r, c] = [maps.length, maps[0].length];
    // ✅ 상, 하, 좌, 우
    const dx = [0, 1, 0, -1];
    const dy = [-1, 0, 1, 0];
    
    // ✅ 깊이우선탐색(DFS) 함수
    function dfs(x, y) {
        maps[x][y] = 0;
        for (let i = 0; i < 4; i++) {
            let nx = x + dx[i];
            let ny = y + dy[i];
            if (nx >= 0 && ny >= 0 && nx < r && ny < c && maps[nx][ny] !== 0) {
                tmp += maps[nx][ny];
                dfs(nx, ny);
            }
        }
    }
    
    // ✅ 문제풀이 시작
    let tmp;
    for (let i = 0; i < r; i++) {
        for (let j = 0; j < c; j++) {
            // ✅ 하나의 섬에 대해 연산이 끝난 경우에는 식량의 총합을 초기화 한다
            tmp = 0;
            if (maps[i][j] !== 0) {
                tmp += maps[i][j];
                dfs(i, j);
                if (tmp !== 0) answer.push(tmp);    
            }
        }
    }
    return answer.length > 0 ? answer.sort((a, b) => a - b) : [-1];
}

2 by 2 행렬을 보고 나서 바로 DFS나 BFS 탐색 알고리즘이 떠올랐다.
풀이는 DFS 알고리즘을 사용했다.
조건을 만족하는 지점들을 끝까지 파고 들면서 방문한 지점은 방문 처리를 해줬다.

profile
성장지향형 프론트엔드 개발자

0개의 댓글