티스토리 뷰

알고리즘/백준

16947번 서울 지하철 2호선 백준 파이썬

글을 쓰는 개발자 2020. 12. 11. 19:18
반응형

문제:www.acmicpc.net/problem/16947

 

16947번: 서울 지하철 2호선

첫째 줄에 역의 개수 N(3 ≤ N ≤ 3,000)이 주어진다. 둘째 줄부터 N개의 줄에는 역과 역을 연결하는 구간의 정보가 주어진다. 같은 구간이 여러 번 주어지는 경우는 없고, 역은 1번부터 N번까지 번호

www.acmicpc.net

 

import sys
N=int(input())
parent=[0]*(N+1)
ans=[0]*(N+1)
graph=[[] for _ in range(N+1)]
graphSize=[0]*(N+1)
for _ in range(N):
    a,b=map(int,input().split())
    graph[a].append(b)
    graph[b].append(a)
    graphSize[a]+=1
    graphSize[b]+=1
while 1 in graphSize:
    for i in range(1,N+1):
        if graphSize[i]==1:
            parent[i]=graph[i][0]
            graphSize[i]=0
            graphSize[parent[i]]-=1
            graph[parent[i]].remove(i)
while any(parent):
    for i in range(1,N+1):
        if parent[i]!=0:
            if parent[parent[i]]==0:
                ans[i]=ans[parent[i]]+1
                parent[i]=0
for i in range(1,N+1):
    print(ans[i],end=' ')​

 

6
1 2
3 4
6 4
2 3
1 3
3 5

밑의 예시의 데이터는 다음과 같다.

위와 같이 graphSize에서 1의 값이 있는 것을 계속 삭제하면 위와 같이 나온다. 

 

그리고 나서 순환선 사이의 거리를 출력해야 하는데 이와 관련된 로직은 다음과 같다.

우선 처음에 부모가 0이 아닌 값을 찾는다. 그리고 그 부모의 부모가 0이면 순환선 거리 계산을 한다.

이렇게 짠 이유는 우선 순환선의 부모값은 0이기 때문에 순환선의 처음에 시작하는 역의 부모의 부모 값은 무조건 0이기 때문이다.

간단하게 위의 예를 가져와서 설명해보자.

우선 처음에

parent[4]는 0이 아니기에 처음 if문에 적합하다.

그리고 다음 if문에서 parent[3]은 0이기 때문에 ans[4]=1의 값을 가진다. 

이런식으로 다 돌면 답이 나온다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함