프로그래머스 - 네트워크

Park Inhye·2024년 3월 28일
0

코테 연습

목록 보기
30/37

카테고리

DFS/BFS

문제

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.

컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.

제한 사항

  • 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
  • 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
  • i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
  • computer[i][i]는 항상 1입니다.

예시

ncomputersreturn
3[[1, 1, 0], [1, 1, 0], [0, 0, 1]]2
3[[1, 1, 0], [1, 1, 1], [0, 1, 1]]1



해결

나는 연결요소 풀이법을 썼고
누군가는 for in의 반복문으로 멋진 답을 썼다

내 풀이

  • 2차원 배열인 네트워크 데이터를 Map 객체인 graph로 변환
    • 정점별로 연결 정점 데이터 분리
  • visited 객체 생성
  • queue가 텅텅 빌 때까지 bfs 탐색
    • 연결된 정점을 다 방문하며 visited 처리
  • bfs 마칠 때마다 count + 1

전체 코드

const makeGraphMap = (N, mapData) => {
    const _map = new Map();

    for (let i = 0; i < N; i++) {
        const _line = mapData[i];

        for (let j = 0; j < N; j++) {
            if (i == j) continue;
            if (mapData[i][j] == 0) continue;

            const [_from, _to] = [i, j];

            if (!_map.has(_from)) _map.set(_from, []);
            if (!_map.has(_to)) _map.set(_to, []);

            _map.get(_from).push(_to);
            _map.get(_to).push(_from);
        }
    }

    return _map;
};

const makeCheckObj = (graph) => {
    const object = {};
    [...graph.keys()].forEach(v => object[v] = false);

    return object;
};

function solution(n, computers) {
    const _graph = makeGraphMap(n, computers);
    const _visited = makeCheckObj(_graph);
    let _count = 0;

    const bfs = (graph, startNode) => {
        const _queue = [startNode];

        while (_queue.length) {
            const _cur = _queue.shift();

            // NOTE: 이거 안 해주면, 간선이 없는 케이스 처리를 못 해 🥹
            if (!graph.has(_cur)) break;

            for (let node of [...graph.get(_cur)]) {
                if (_visited[node]) continue;

                _visited[node] = true;
                _queue.push(node);
            }
        }
    };


    for (let i = 0; i < n; i++) {
        if (_visited[i]) continue;

        bfs(_graph, i);
        _count += 1;
    }

    return _count;
}


누군가의 풀이

  • 전체 탐색
    • Array의 for in 반복문
    • for (let i in Array) { ... }에서 i는 index임
    • 중첩 for in 문을 써서 전체 탐색함
      • 값이 1인 경우에만 dfs
  • visitArr
    • 1차 배열
    • 이전 row로 돌아가지 않도록 visited 처리

전체 코드

let arr;
let visitArr;

function solution(n, computers) {
    let ctr = 0;
    arr = computers;
    visitArr = new Array(n).fill(false);

    for (let i in arr) {
        ctr += dfs(i);
    }

    return ctr;
}

function dfs(i) {
    if (visitArr[i] == true) return 0; // 이전 row로 돌아기지 않음
    else visitArr[i] = true;

    for (let j in arr[i]) {
        if(arr[i][j] == 1) dfs(j); // 연결이 된 경우에만 dfs 돌아감
    }

    return 1;
}

참고

profile
👁👄👁

0개의 댓글