0418 TIL

looggi·2023년 4월 18일
0

TILs

목록 보기
62/114
post-thumbnail

프로그래머스 문제풀기

➡️ 달리기 경주

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

처음에 이렇게 풀었는데 시간초과 오류가 났다

def solution(players, callings):
    player_indexes = {player: index for index, player in enumerate(players)}

    for j in callings:
        current_index = player_indexes[j]
        desired_index = current_index - 1
        if current_index > 0 and players[desired_index] != j:
            players[current_index], players[desired_index] = players[desired_index], players[current_index]
            player_indexes[players[current_index]] = current_index
            player_indexes[players[desired_index]] = desired_index
    return players

다른 사람들의 풀이를 보니 나랑 비슷한데 왜 이 풀이가 오류가 났을까 생각해보니
{player:index} 딕셔너리를 만들어줘서 c를 키값으로 이용해서 검색하면 속도가 훨씬 빠르기 때문이었다
내가 했던 것과 마찬가지로 players 차제가 바뀌어서 players를 그대로 리턴해주면 된다

def solution(players, callings):
    dic_players = {p:i for i,p in enumerate(players)}
    dic_rank = {i:p for i,p in enumerate(players)}
    
    for call in callings :
        call_rank = dic_players[call] 
        call_front = dic_rank[call_rank - 1] 
        
        dic_players[call], dic_players[call_front] = dic_players[call_front], dic_players[call]
        dic_rank[call_rank], dic_rank[call_rank - 1] = dic_rank[call_rank - 1], dic_rank[call_rank]
    
    return list(dic_rank.values())

보다 더 빠른 건 딕셔너리를 2개 이용하는 방법으로 랭크를 키로 하는 {index:player} 딕셔너리를 사용해서 답을 구하는 방식이다.
딕셔너리만 이용하기때문에 속도가 가장 빠른 것 같다

profile
looooggi

0개의 댓글