[BOJ] Q3665 최종 순위

Question

Language: Python

Difficulty: Gold 1

작년의 종합 순위를 알려주고, 올해에는 변화된 순위 정보만을 제공했을 때, 이를 토대로 올해의 종합순위를 알 수 있는 가에 대한 문제 –> Graph에서 순위? Topological Sorting이다.

우선, 그래프를 생성해줘야 하는데, 순위가 낮은 팀에서 높은 팀으로 이어주는 방식으로 그래프를 생성해준다.

올해에 순위가 바뀐 팀에 대한 정보를 이용해서 그래프를 수정한 다음 이를 Topological Sorting을 진행해본다.

Solution

from collections import deque
def solution():
    queue=deque()
    confused=False
    cycle=False
    sorted_list=[]
    

    for i in range(1,n_teams+1):
        if indegree[i]==0:
            queue.append(i)
 
    for _ in range(n_teams):
        if len(queue)==0:
            cycle=True
            break

        if len(queue)>=2:
            confused=True
            break

        vertex=queue.popleft()
        sorted_list.append(vertex)
        for adj_vertex in range(1,n_teams+1):
            if graph[vertex][adj_vertex]:
                indegree[adj_vertex]-=1

                if indegree[adj_vertex]==0:
                    queue.append(adj_vertex)

    if cycle or confused:
        print("IMPOSSIBLE")
    else:
        print(*sorted_list)
        

if __name__ =="__main__":
    testcases=int(input())
    for _ in range(testcases):
        n_teams=int(input())
        graph=[[False] * (n_teams+1) for _ in range(n_teams+1)]
        indegree=[0]*(n_teams+1)          
        teams=list(map(int,input().split()))
        for i in range(n_teams):
            for j in range(i+1,n_teams):
                indegree[teams[j]]+=1
                graph[teams[i]][teams[j]]=True
            
        n_changes=int(input())
        for _ in range(n_changes):
            v1,v2=map(int,input().split())
            if graph[v1][v2]:
                indegree[v2]-=1
                indegree[v1]+=1
                graph[v1][v2]=False
                graph[v2][v1]=True
                
            else:
                indegree[v1]-=1
                indegree[v2]+=1
                graph[v2][v1]=False
                graph[v1][v2]=True
        solution()

댓글남기기