코테 및 알고리즘

프로그래머스 - 네트워크

Jay_Jung 2024. 8. 3. 16:28

<문제>

https://school.programmers.co.kr/learn/courses/30/lessons/43162

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

<문제 핵심>

1. dfs를 활용한 문제

 

2. 해당 인덱스를 방문을 했는지 안 했는지 체크 해줌으로써 무한 루프 방지 해주기

-> visited 배열 생성

 

3. computers 배열을 순회하면서 컴퓨터와 연결된 컴퓨터를 발견하고 방문하지 않은 컴퓨터라면 다시 재귀적으로 다음 컴퓨터를 기준으로 탐색

 

<문제 풀이과정 및 순서도>

1. n개 만큼 방문처리 배열을 생성한다.

let visited = Array(n).fill(false);
let answer = 0;

 

2. computes배열 갯수만큼 반복문을 돌리고 방문하지 않은 컴퓨터라면 dfs함수를 호출한다.

for (let i=0; i < computers.length; i++) {
    if (!visited[i]) {
        dfs(i)
        answer++;
    }
}

 

3. i 컴퓨터와 연결된 컴퓨터 j가 있고 j번째 컴퓨터를 방문하지 않았다면 j를 기점으로 다시 dfs함수를 호출한다.

function dfs(i) {
    visited[i] = true;
    for(let j=0; j<computers[i].length; j++) {
        if(computers[i][j]===1 && !visited[j]){
            dfs(j);
        }
    }
}

 

<전체 코드>

function solution(n, computers) {
    //n개의 갯수만큼 방문체크 배열 세팅
    let visited = Array(n).fill(false);
    let answer = 0;

    function dfs(i) {
        visited[i] = true;
        for(let j=0; j<computers[i].length; j++) {
            if(computers[i][j]===1 && !visited[j]){
                dfs(j);
            }
        }
    }
    
    for (let i=0; i < computers.length; i++) {
        if (!visited[i]) {
            dfs(i)
            answer++;
        }
    }
    return answer;
}

 

<전체 코드 - bfs 방식으로도 풀어 본 문제>

function solution(n, computers) {
    let visited = Array(n).fill(false);
    let answer = 0;

    function bfs(start) {
        let queue = [start];
        visited[start] = true;

        while (queue.length > 0) {
            let node = queue.shift();

            for (let j = 0; j < computers[node].length; j++) {
                if (computers[node][j] === 1 && !visited[j]) {
                    visited[j] = true;
                    queue.push(j);
                }
            }
        }
    }

    for (let i = 0; i < computers.length; i++) {
        if (!visited[i]) {
            bfs(i);
            answer++;
        }
    }
    
    return answer;
}