Completion over Perfection

프로그래머스 - 달리기 경주 (Python 3 파이썬 3) 본문

파이썬 (Python)

프로그래머스 - 달리기 경주 (Python 3 파이썬 3)

난차차 2023. 8. 14. 00:43
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/178871

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

프로그래머스에서 난이도 1단계 문제인 달리기 경주입니다. 

 

처음 문제를 보고, 

어? 단순하게 딕셔너리 하나 선언한 다음에 업데이트 계속 시켜주면 되겠다 싶었는데,

시간초과 나는 예제가 5~6개가 나왔습니다. 

 

그래서 단순히 for문을 돌려서 하면 안되고 player들의 이름을 key로 가지는 딕셔너리 1개, 

각 player들의 순서를 key값으로 가지는 딕셔너리 1개를 각각 선언해서 2개의 딕셔너리로 풀면 잘 풀립니다. 

 

간단히 설명해보자면, 

 

{"mumu": 1, "soe": 2, "poe" : 3, "kai": 4, "mine": 5}

이런식으로 이름을 key값으로 갖고 value에는 순서를 가지는 딕셔너리 1개와

 

{1: "mumu", 2: "soe", 3: "poe", 4: "kai", 5: "mine"}

이런식으로 첫번째 딕셔너리와는 반대로 순서를 key값으로 갖고 value에는 이름을 가지는 딕셔너리 1개를 선언합니다. 

 

그리고 순서가 바뀔때마다 저 두 개의 딕셔너리를 각각 업데이트 해주고, 

마지막에 answer 배열에 순서를 key값으로 가지는 딕셔너리에서 value를 추출해서 붙여주면 답이 됩니다. 

 

자세한 내용은 아래 코드에서 확인해보세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def solution(players, callings):
    answer = []
    dict_name = {}
    dict_order = {}
    for i in range(len(players)):
        dict_name[players[i]] = i
        dict_order[i] = players[i]
 
    for calledName in callings:
        # calledName = "kai"
        # 바꿀 대상이 되는 인덱스와 이름을 가져옴
        calledNum = dict_name[calledName] # 4 (kai의 인덱스)
        targetName = dict_order[calledNum-1# "poe" (스위칭할 대상의 이름)
        targetIdx = calledNum-1 # 3 (poe의 인덱스)
        dict_name[calledName] -= 1 # kai의 값이 4에서 3으로 바뀜
        dict_order[dict_name[calledName]] = calledName # 3번째 값이 kai로 바뀜
        # 원래 3번째 자리에 있던 poe의 값을 4로 바꿈
        dict_name[targetName] = calledNum 
        dict_order[calledNum] = targetName
 
    for player in dict_order.values():
        answer.append(player)
    
    return answer
cs

 

 

반응형
Comments