Python/프로그래머스

도넛과 막대 그래프

룰루랄라룰루랄라 2024. 3. 21. 19:18

2024 KAKAO WINTER INTERNSHIP 문제

 

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

그래프 용어를 오랜만에 보아서 조금 당황했었다

크기가 n 인 세가지 종류 그래프들이 있을 수 있고 각각 특징이 있다.

어떤 크기, 어떤 종류의 그래프가 있을지 모르고 각 그래프 정점마다 서로 다른 번호가 매겨지며

생성되는 그래프 수의 합은 2 이상!

이때, 새로운 번호가 매겨진 새 정점 하나가 추가 된다.

이 정점은 다른 그래프들의 임의의 정점 하나로 향해 연결되는 간선이 만들어진다!

 

간선 정보를 담은 2차원 배열이 주어지고, 이 정보로 어떤 그래프가 몇개 있는지, 새로 생긴 정점은 몇 번 인지 알아내라!

하는 문제이다!

 

도넛 모양 그래프
막대 모양 그래프
8자 모양 그래프

그림으로 보면 이렇게 생겼다!

간선 정보만 가지고 그래프의 수를 알아내려면 각 그래프가 가진 간선의 특징을 알아봐야 할 것 같았다..

 

1. 도넛 모양 그래프

size=1 일때는 하나의 간선이 하나의 정점을 돌고, 나머지는 들어오는 간선과 나가는 간선이 1개씩

size=1 일때를 제외하고는 모든 정점이 같은 특징을 보이므로 몇 개의 그래프로 나뉜 것인지 알아내기 어렵다

전체 그래프 수 에서 막대와 8자 그래프 수를 빼주면 나올 것!

 

2. 막대 모양 그래프

size=1 일때는 들어오는 간선 0개, 나가는 간선 0개, 나머지의 경우는 맨 마지막 정점이 들어오는 간선 1개. 나가는 간선 1개 ( 들어오는, 나가는 너무 기니까 [in,out] 으로 대체하겠다 )

새 정점이 막대 모양 그래프의 임의의 정점에 연결 된다면! size=1 일때는 [1,0], 나머지의 경우 맨 마지막 정점은 [2,0] 으로 하나의 그래프당 무조건 [1이상,0] 의 정점이 생기는 특징!

 

3. 8자 모양 그래프

그래프 1개가 있다면 중간 정점이 무조건 있고 간선은 [2,2] 이다

새 정점에서 임의로 연결되면 중간에 연결 된다면 [3,2] 아니라면 [2,2] 이므로 무조건 [2이상,2] 의 정점이 생기는 특징!

 

4. 새로운 정점

그래프 총 합이 무조건 2개 이상 이고, 새로 생긴 정점에는 아무 간선도 들어오지 않으므로

간선 특징은 [0,2이상] 이 된다!

 

 

자.. 이걸 정리해서 최종 코드는 이렇다!

def solution(edges):
    
    nlist=[]
    for ed in edges:
        nlist.append(ed[0])
        nlist.append(ed[1])
    nlist = list(set(nlist)) # 정점들을 유니크하게 보기 위함

    node_dict={}
    for n in nlist:
        node_dict[n]=[0,0] # in,out
    
    # 정점마다 in,out 체크
    for ed in edges:
        node_dict[ed[0]][1]+=1
        node_dict[ed[1]][0]+=1
        
        
    answer=[0,0,0,0]
    
    for n,info in node_dict.items():
        if info[0]==0 and info[1]>=2: # 새 정점
            answer[0]=n
            
        elif info[0]>=1 and info[1]==0: # 막대
            answer[2]+=1
            
        elif info[0]>=2 and info[1]==2: # 8자
            answer[3]+=1
    
    total=0
    for ed in edges: # 정점에서 연결 체크
        if ed[0]==answer[0]:
            total+=1
    
    # 새 정점으로 알아낸 그래프 총 합에서 막대,8자 그래프 수 빼기
    answer[1]=(total-answer[2]-answer[3])
        

    return answer

 

각 그래프마다 특징이 있구나! 하는걸 처음부터 알아차리지 못해서 시간이 조금 걸렸지만 끝~

 

 

출처 : https://school.programmers.co.kr/learn/challenges

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

예상 대진  (1) 2024.03.25
구명보트  (0) 2024.03.25
카펫  (0) 2024.03.25
피보나치 수  (0) 2024.03.25
가장 많이 받은 선물  (0) 2024.03.21