ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] 백준 2458 - 키 순서
    알고리즘 2022. 12. 1. 14:56
    728x90

    1. 문제

    키 순서

     

    2. 접근

    1. 이번 키 문제는 이코테에 비슷한 문제가 있어서 생각을 해내는 것도 풀이를 하는 것도 편했다 ( 이코테 - 정확한 순위 )

    2. n(노드)의 범위가 500이하 이므로 플라워드 - 워셜을 사용할 수 있는 조건을 만족한다

    3. 기본적으로 플로이드-워셜은 2차원 배열을 초기화시키고, 같은 노드에서 같은 노드로 옮기면 거리는 0임을 알아야 한다

    4. 문제에서 2사람 만을 비교하므로, 거리가 1이다.

    5. a -> b or b -> a 이 모두 INF 가 아니라면 count 를 증가하여 result 값을 올려야 한다

     

     

    3. 풀이

    import sys
    input = sys.stdin.readline
    
    n, m = map(int, input().split())
    
    INF = int(1e9)
    
    graph = [[INF] * (n+1) for _ in range(n+1)]
    distance = [INF] * (n+1)
    
    for i in range(1, n+1):
        for j in range(1, n+1):
            if i == j:
                graph[i][j] = 0 # 같은 노드에서 같은 노드로 옮기면 거리가 0이다
    
    for i in range(m):
        a, b = map(int, input().split())
        graph[a][b] = 1 # 두 사람만을 비교하므로, 거리가 1이다
    
    for k in range(1, n+1):
        for a in range(1, n+1):
            for b in range(1, n+1):
                graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b]) # 기본 알고리즘
    
    res = 0
    for i in range(1, n+1):
        count = 0
        for j in range(1, n+1):
            if graph[i][j] != INF or graph[j][i] != INF: 둘 중하나라도 INF 아니면 count증가
                count += 1
        if count == n:
            res += 1
    print(res)
Designed by Tistory.