FrontEnd/프로그래머스

[JS] 트리 트리오 중간값

728x90

트리 구조의 특징을 활용하여 해결하였다!!

 

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

 

프로그래머스

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

programmers.co.kr

 

 

문제를 잘 읽어보면 정답이 "트리에서의 최장거리" 혹은 "트리에서의 최장거리 - 1"임을 알 수 있다.

 

1. 최장 거리의 두 점을 A,B라고 두고 A와 B사이에서 A혹은 B와 가장 인접한 점을 C로 두면 중간값이 최장거리 -1이 된다.

2. 최장거리가 여러 경우로 나오는 경우 3개의 점이 서로 최장거리가 되므로 중간값이 최장거리로 만들 수 있다.

 

 

즉, 해당 문제는 "트리의 최장거리 구하기" 문제로 바뀐다. 트리 구조에서 최장거리를 구하는 방법은 생각보다 단순하다!

 

1. 임의의 노드(A)를 잡아서 가장 거리가 먼 노드(B)를 정한다.

2. (B)노드를 기준으로 가장 거리가 먼 노드(C)를 구한다.

3. B-C 사이의 거리가 최장거리가 된다. (여러개일 수 있다)

 

 

 

 

 

 

function solution(n, edges) {
    const tree = [...Array(n+1)].map(_=>[])
    for(const [s,e] of edges){
        tree[s].push(e)
        tree[e].push(s)
    }
    
    const getMaxInfo = (node) => {
        
        const visited = Array(n+1).fill(false)
        const stk = [[node,0]]
        const ret = {
            maxLen : 0,
            ary : []
        }
        
        while(stk.length){
            const [node,cnt] = stk.pop()
            visited[node] = true
            if(cnt > ret.maxLen){
                ret.maxLen = cnt
                ret.ary = [node]
            } else if (cnt === ret.maxLen) {
                ret.ary.push(node)
            }
            
            for(const nxNode of tree[node]){
                if(visited[nxNode]) continue
                stk.push([nxNode,cnt+1])
            }
        }
        return ret
    }
    
    const {ary} = getMaxInfo(1)
    
    const ret = getMaxInfo(ary[0])
    if(ary.length>1 || ret.ary.length>1) return ret.maxLen
    else return ret.maxLen-1
    
    
    
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 사칙연산  (0) 2024.04.25
[JS] 지형 이동  (1) 2024.03.28
[JS] 지형편집  (0) 2024.03.21
[JS] 동굴탐험 (2020 카카오인턴십)  (0) 2024.03.19
[JS] 블록 게임 [2019 카카오]  (2) 2024.03.18