프로그래머스 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개의 댓글

Powered by GraphCDN, the GraphQL CDN