BOJ - 2458번 키 순서 (Python)

woga·2021년 1월 29일
0

python 풀이

목록 보기
27/27
post-thumbnail

문제 출처: https://www.acmicpc.net/problem/2458

난이도

Gold 4


풀이 방법

플로이드-와샬 알고리즘 사용

보통 위 알고리즘 같은 경우, A->C로 갈 때 B와 D로 거칠 수 있는지 여부와 방법의 수를 찾는데 쓰였는데 키 순서에 적용된다는 발상 전환이 되게 독특했다.
아마 문제 설명 속 1번은 5번보다 키가 작고, 5번은 4번보다 작기 때문에, 1번은 4번보다 작게 된다. 이라는 대목에서 힌트를 얻을 수 있을 것 같다.

A B C D E식의 순서로 되어 있는데 C가 5명 중 본인보다 큰 사람이 2명인 것을 알고 본인보다 작은 사람이 2명인것을 알면 키 순서 3등 이라는 것을 유추하기 쉽다. 이 문제에서는 이 관점을 사용해서 푸는데, 그럼 C가 자기보다 크고 작고를 어떻게 아는지를 판별해야한다. 이를 위해 플로이드 와샬을 쓰는 것이다.


통과 코드

import sys

if __name__ == '__main__':
    N,M = map(int,input().split())
    INF = sys.maxsize
    height = [[INF]*(N) for _ in range(N)]

    for _ in range(M):
        short, tall = map(int,input().split())
        height[tall-1][short-1] = 1

    for k in range(N):
        for i in range(N):
            for j in range(N):
                if height[i][k] == 1 and height[k][j] == 1:
                    height[i][j] = 1

    count = [0]*(N)
    for i in range(N):
        for j in range(N):
            if height[i][j] == 1:
                count[i] += 1
                count[j] += 1

    print(count.count(N-1))

etc

사실 시간초과만 계속 나서 답답했다. 알고보니 Python3가 아닌 pypy3 형식으로 컴파일하면 통과가 됐다!
이 둘의 차이점이 궁금해서 찾아보니 둘은 동일한 문법을 제공하지만, pypy3이 python3보다 빠른 속도를 지녔다고 한다. 그래서 python3에서 시간초과 난다면 pypy3에서 한번 돌려보라고 추천하는 글을 보기도 했다.

profile
와니와니와니와니 당근당근

0개의 댓글