𝘼𝙣𝙖𝙡𝙮𝙨𝙞𝙨/ᴀʟɢᴏʀɪᴛʜᴍ
[Programmers] 달리기 경주
콜라맛갈비
2023. 7. 7. 17:05
728x90
def solution(players, callings):
answer = {}
for i, v in enumerate(players) :
answer[i] = v
for j in callings :
for i, v in answer.items() :
if v == j :
answer[i] = answer[i-1]
answer[i-1] = j
return [j for j in answer.values()]
시간초과!!
1. 선수 : 등수로 딕셔너리 저장하기
def solution(players, callings):
result = {player: i for i, player in enumerate(players)} # 선수: 등수
for who in callings:
idx = result[who] # 호명된 선수의 현재 등수
result[who] -= 1 # 하나 앞 등수로 바꿔줌 -1
result[players[idx-1]] += 1 # 앞에 위치했던 선수의 등수 +1
players[idx-1], players[idx] = players[idx], players[idx-1] # 위치 변경
return players
2. 인덱스 사용 말고, 딕셔너리를 두개 생성하는 방법!!
def solution(players, callings):
# 선수: 위치
p_idx_dict = {player: i for i, player in enumerate(players)}
# 위치: 선수
idx_p_dict = {i: player for i, player in enumerate(players)}
for call in callings:
cur_idx = p_idx_dict[call] # 현재 선수의 위치
pre_idx = cur_idx-1 # 현재 선수보다 앞에 있는 선수 등수
cur_player = call
pre_player = idx_p_dict[pre_idx] # *
p_idx_dict[cur_player] = pre_idx # 현재 선수는 앞에 선수 등수가 되고
p_idx_dict[pre_player] = cur_idx # 앞에 선수는 뒷 등수가 되고
idx_p_dict[pre_idx] = cur_player # 등수별 선수 표 업데이트 * 때문에
idx_p_dict[cur_idx] = pre_player
return list(idx_p_dict.values())
728x90