Algorithm
프로그래머스
Python
도넛 차트와 막대 그래프

도넛과 막대그래프

https://school.programmers.co.kr/learn/courses/30/lessons/258711 (opens in a new tab)

풀이1

풀이 1번은 degree와 숫자의 개수를 활용해서 풀이하는 방법이다.

from collections import defaultdict
 
def find_centroid(graph, inDegree, outDegree):
    # centroid = 중심 시작점: 들어오는 엣지 없고, 나가는 엣지 2개 이상임 (유일)
    for node in graph.keys():
        if inDegree[node] == 0 and outDegree[node] >= 2:
            return node
 
def count_graphs(centroid, graph, inDegree, outDegree):
    count = [0, 0, 0] # 도넛 모양, 막대 모양, 8자 모양
    visited = set()
    for start in graph[centroid]: # 중심 시작점이 갈 수 있는 모든 노드에 대해 탐색
        visited.add(start)
        curr = start
        while curr:
            if outDegree[curr] == 0: # 나가는 엣지 없음: 막대 모양
                count[1] += 1
                break
            elif outDegree[curr] == 2: # 나가는 엣지 2개: 8자 모양의 중심
                count[2] += 1
                break
            curr = graph[curr][0] # 다음으로 이동
            if curr in visited and outDegree[curr] == 1: # 이미 방문한 노드면서 나가는 엣지 1개면 도넛
                count[0] += 1
                break
            visited.add(curr)
    return [centroid] + count
 
def solution(edges):
    graph = defaultdict(list)
    inDegree = defaultdict(int) # 들어오는 엣지 개수
    outDegree = defaultdict(int) # 나가는 엣지 개수
    for start, end in edges:
        graph[start].append(end)
        inDegree[end] += 1
        outDegree[start] += 1
 
    centroid = find_centroid(graph, inDegree, outDegree)
    return count_graphs(centroid, graph, inDegree, outDegree)