본문 바로가기

코딩테스트

[Python] 달리기 경주

def solution(players, callings):
    for call in callings:
        i = players.index(call)
        player = players[i-1]
        players[i-1] = call
        players[i] = player
    return players

시간 초과 뜸

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

이렇게 swap으로도 바꿔봤는데 여전히 시간 초과..

정답 코드

def solution(players, callings):
    player_dict = {player: i for i, player in enumerate(players)}
    for call in callings:
        i = player_dict[call]
        player_dict[players[i-1]], player_dict[players[i]] = i, i-1
        players[i-1], players[i] = players[i], players[i-1]
    return players

players 배열을 딕셔너리 형태로 변환해서, 이름이 불린 player의 index를 찾는 데 걸리는 시간을 줄이는 것이다.

callings 배열에 불린 player의 index를 딕셔너리에서 받아오고, 딕셔너리에 추월한 player와 추월당한 player의 인덱스를 바꾼다.

동시에 players 배열도 바꿔준다.

배열과 딕셔너리를 같이 바꿔주는게 맘에 안드는 코드이긴 하지만,,, 딕셔너리만 가지고 풀 수 있는 방법도 시도해보아야 겠다.

enumerate

기본적으로 인덱스와 원소로 이루어진 튜플(tuple)을 만들어준다.

 

'코딩테스트' 카테고리의 다른 글

[Python] 공원 산책  (0) 2024.03.12
[Python] 가장 가까운 같은 글자  (0) 2024.03.07
[Python] 문자열 겹쳐쓰기  (0) 2024.03.05
[Python] 추억 점수  (0) 2024.03.05
[Python] 최댓값과 최솟값  (0) 2024.01.19