새소식

알고리즘 테스트 ⏲/프로그래머스

[프로그래머스] lv3. 가장 먼 노드풀이 / Python, JavaScript

  • -
 

프로그래머스

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

programmers.co.kr

 

lv3. 가장 먼 노드

접근한 방법

BFS를 이용해서 빠르게 해결할 수 있습니다. 주의할 점은 간선 저장 시 인접 행렬을 사용할 경우 시간이 초과됩니다. 노드 보다 간선이 적을 경우 매우 비효율적이므로 상대적으로 탐색에 더 효율적인 인접 리스트를 사용합니다.

 

간선을 저장했다면 큐를 이용해서 노드(now)와 간선 길이(cnt)를 관리합니다.

JavaScript에서는 별도의 큐 라이브러리가 없으므로 shift 메서드를 사용하고 문제에는 영향이 없지만 비효율적이라 싫다면 front를 가리키는 포인터를 설정하여 큐 처럼 사용하면 되겠습니다.

 

결과 배열(result)에 현재 방문한 노드까지의 간선 길이를 입력해주고 현재 방문한 노드에 연결된 리스트를 확인하여 방문하지 않은 노드를 탐색합니다. 최종적으로 결과 배열에는 노드1로부터 각 노드에 도달하는 길이가 저장되고 가장 긴 길이의 개수를 카운트하여 리턴합니다.

 

 

Python(인접 리스트)

def solution(n, edge):
    graph = [[] for _ in range(n + 1)]
    for _ in edge:
        a, b = _
        graph[a].append(b)
        graph[b].append(a)
    from collections import deque
    q = deque()
    q.append((1, -1))
    visited = [0] * (n + 1)
    visited[1] = 1
    
    result = [0] * (n + 1)
    while q:
        now, cnt = q.popleft()
        result[now] += cnt + 1
        for i in graph[now]:
            if not visited[i]:
                visited[i] = 1
                q.append((i, cnt + 1))
    return result.count(max(result))

Python(인접 행렬  / 시간 초과)

def solution(n, edge):
    graph = [[0] * (n + 1) for _ in range(n + 1)]
    for _ in edge:
        a, b = _
        graph[a][b] = 1
        graph[b][a] = 1
    
    from collections import deque
    q = deque()
    q.append((1, -1))
    visited = [0] * (n + 1)
    visited[1] = 1
    
    result = [0] * (n + 1)
    while q:
        now, cnt = q.popleft()
        result[now] += cnt + 1
        for i in range(len(graph[now])):
            if graph[now][i] and not visited[i]:
                visited[i] = 1
                q.append((i, cnt + 1))
    return result.count(max(result))

JavaScript

function solution(n, edge) {
    const graph = Array.from({length: n + 1}, () => [])
    edge.forEach(e => {
        const [a, b] = e
        graph[a].push(b)
        graph[b].push(a)
    })
    const q = [[1, -1]]
    const visited = Array(n + 1).fill(0)
    visited[1] = 1
    const result = Array(n + 1).fill(0)
    while (q.length) {
        const [now, cnt] = q.shift()
        result[now] += cnt + 1;
        for (const i of graph[now]) {
            if (!visited[i]) {
                visited[i] = 1
                q.push([i, cnt + 1])
            }
        }
    }
    const m = Math.max(...result)
    let cnt = 0
    result.forEach(v => {
        if (v === m) cnt += 1
    })
    return cnt
}

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.