Python/Algorithm

[프로그래머스] 달리기 경주 - Python

언킴 2023. 8. 24. 14:52
반응형

 

 

 

문제를 살펴보면 단순히 역전한 결과를 스왑(swap)하면 되지 않을까 라고 생각해서, list를 이용하여 아래와 같이 문제를 풀어보았다. 

# 시간초과
def solution(players, callings):

    for calls in callings:
        idx = players.index(calls)
        values = players.pop(idx)
        players.insert(idx-1, values)

    return players
    
 def solution(players, callings):
 	for calls in callings:
    idx = players.index(calls)
    players[idx-1], players[idx] = players[idx], players[idx-1]
    return players

 

Runtime Error를 출력하기 때문에 다른 방식으로 풀어야 한다. 그렇다면, 먼저 딕셔너리를 생성하고, 딕셔너리에 현재 랭킹을 표시한다. 그런다음, 랭킹이 역전되면 현재 선수와 앞 랭크 선수의 위치를 바꾸어 주고, 그런 다음 swap을 하면 된다. 이와 같은 방식으로 수행하면 list를 순회하면서 위치를 찾는 방식으로 진행하지 않아도 된다.

 

def solution(players, callings):
    answers = dict({player: i for i, player in enumerate(players)})
    for calls in callings:
        idx = answers[calls]
        answers[calls] -= 1
        answers[players[idx-1]] += 1
        players[idx-1], players[idx] = players[idx], players[idx-1]
    return players

딕셔너리를 생성해서 idx를 찾는다면 list에서 순회하여 idx를 찾는 것보다 훨씬 빠르게 idx를 찾을 수 있다.