[프로그래머스] 도넛과 막대 그래프

Chobby·2024년 2월 22일
1

Programmers

목록 보기
329/345

😀요점

  1. 간선 잇기. 입력 간선, 출력 간선, 노드의 값 표시
  2. 전체 노드를 1회 순회하며 그래프 수 조회
  3. 시작 정점 출력 간선의 수 = 모든 그래프의 수
    3-1. 출력 간선 0개 = 막대 그래프
    3-2. 출력 간선 1개 = 신경X 타 그래프의 연결점
    3-3. 출력 간선 2개 = (시작 정점 | 8자 그래프)
    3-3-1. 입력 간선 1개 이상 = 8자 그래프
    3-3-2. 입력 간선 0개 = 시작 정점
    3-4. 출력 간선 2개 이상 = 시작 정점
  4. 도넛 그래프의 수 = 시작 정점 출력 간선 수 - 다른 그래프의 수

😎풀이

function solution(edges) {
    // 시작 정점
    let start = null
    // 도넛 그래프, 막대 그래프, 8자 그래프 수
    let bar = 0
    let donut = 0
    let character8 = 0
    const graph = []
    // 그래프 생성
    for (const [from, to] of edges) {
        if (!graph[from]) {
            graph[from] = {
                from: [],
                to: [to],
                val: from
            }
        } else graph[from].to.push(to)
        if (!graph[to]) {
            graph[to] = {
                from: [from],
                to: [],
                val: to
            }
        } else graph[to].from.push(from)
        
    }
    graph.shift()
    for(const node of graph) {
        const toLen = node.to.length
        const fromLen = node.from.length
        
        // 막대 그래프
        if(toLen === 0) bar++
        // 시작 정점 또는 8자 그래프
        else if(toLen === 2) {
            if(fromLen > 0) character8++
            else start = node
        }
        // 시작 정점         
        else if(toLen >= 2) start = node
    }
    // 시작 정점 출력 간선의 수 = 모든 그래프의 수 
    donut = start.to.length - bar - character8
    return [start.val, donut, bar, character8] 
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글