본문 바로가기
💾 Algorithm/문제 풀이

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

by llddang 2024. 11. 9.
난이도 : Level 2
알고리즘 유형 : 그래프 탐색
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/258711

 

 

문제

도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프들이 있습니다. 이 그래프들은 1개 이상의 정점과 정점들을 연결하는 단방향 간선으로 이루어져 있습니다.

도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프가 여러개 있습니다. 이 그래프들과 무관한 정점을 하나 생성한 뒤, 각 그래프의 임의의 정점 하나로 향하는 간선들을 연결했습니다.

그 후 각 정점에 서로 다른 번호를 매겼습니다.

이때 당신은 그래프의 간선 정보가 주어지면 생성한 정점의 번호와 정점을 생성하기 전 도넛 모양 그래프의 수, 막대 모양 그래프의 수, 8자 모양 그래프의 수를 구해야 합니다.

입력

그래프의 간선 정보를 담은 2차원 정수 배열 edges가 매개변수로 주어집니다.

출력

생성한 정점의 번호, 도넛 모양 그래프의 수, 막대 모양 그래프의 수, 8자 모양 그래프의 수를 순서대로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

 

풀이 과정

  • 도넛 모양, 막대 모양, 8자 모양의 그래프들만 존재한다는 것 유의하기.
  • 최소 2개 이상의 그래프가 주어진다는 것 유의하기.
  • 메인 생각
    • 생성한 정점의 번호 : 들어오는 간선은 없고 나가는 간선이 2개 이상인 정점 찾기.
    • 도넛 모양 그래프의 수 : 생성한 정점에서 나가는 간선의 수 - 막대 모양 그래프의 수 - 8자 모양 그래프의 수
    • 막대 모양 그래프의 수 : 나가는 간선이 존재하지 않는 정점의 갯수
    • 8자 모양 그래프의 수 : 들어오는 간선이 2개 이상이고 나가는 간선이 2개인 정점의 갯수

 

코드

function solution(edges) {
    const map = {};
    
    for (const [a, b] of edges) {
        if ( !(a in map) ) map[a] = {in: 0, out: 0};
        if ( !(b in map) ) map[b] = {in: 0, out: 0};
        
        map[a].out++;
        map[b].in++;
    }
    
    let addedNode = 0;
    let bar = 0, eight = 0;
    
    for (const [n, v] of Object.entries(map) ){
        if(v.in === 0 && v.out >= 2) addedNode = +n;
        else if (v.out === 0) bar++;
        else if (v.in >= 2 && v.out === 2) eight++;
    }
    
    let donut = map[addedNode].out - bar - eight;
    
    return [addedNode, donut, bar, eight];
}

 

 

회고

처음에는 도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프 이외의 모양의 그래프들도 주어지는 줄 알았다. 그래서 시작하기 막막했지만 문제를 천천히 다시 읽어보니, 3개의 모양 그래프가 여러개 있다라고만 나와있지 이외의 그래프가 주어진다는 말이 없었다. 그저 혼자서 문제를 더 꼬아 생각하고 있던 것이였다 ㅋㅋㅋ
앞으로는 단순하게 접근해봐야겠다!