카테고리 없음

프로그래머스 Python Lv.1 달리기 경주

s2h15 2023. 11. 28. 19:10
728x90

 문제 설명  

얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.
선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.

나의 풀이

def solution(players, callings):
    for c in callings:
        for i,s in enumerate(players):
            if c == s:
                players.insert(i-1,s)
                del players[i+1]
    return players

 

for 중첩을 사용하여 callings에 있는 이름과 같은 players의 값이 나오면 그 값을 앞자리에 insert 해주고 원래 그 자리에 있던 값을 삭제하는 형식으로 풀었다.

그랬더니 아래 사진과같이 7번부터 13번까지 시간 초과로 인한 실패가 떴다.

시간을 줄이는 코딩은 어떻게 하는 것일까에 대한 고민을 해야한다.

 

 

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

 

두번째로 풀어본 나의 풀이이다. 

n 이라는 변수에  callings의 요소 c 앞에 있는 값을 주어 c값의 자리 앞에는 c값 , c값 자리에는 n 값을 넣는 방식으로

아예 값을 바꾸어주는 방식으로 풀었다.

그러나 이번에도 채점 기준 시간 초과였다..

 

다른사람 풀이 + 개선점

두번의 실패 이후 딕셔너리를 사용하고자 했지만 딕셔너리를 사용하였을때 두번째 callings 요소를 불러내어 

조건을 처리할때부터 바뀐 값을 적용하는 것이 난관이었다.

다른분들의 풀이를 보니 나와 다른 점이 딱 하나 있었는데 바로 players[c-1], players[c] = players[c], players[c-1]

이 부분이다.

예시를 들어 설명하겠다.

list = ["mumu", "soe", "poe", "kai", "mine"]
list[0],list[1] = list[1], list[0]
print(list)

 

['soe', 'mumu', 'poe', 'kai', 'mine']

 

위의 예시처럼 0번과 1번의 값을 1번과 0번의 값으로 한번에 바꿀 수 있었다.

항상 문제가 하나씩 바꾸면 이미 0 번의 값은 1번의 값이 되어 1번의 값이 원래의 0번 값을 가질수 없었다는 것이었다.

따라서 위의 예시를 사용하여 문제를 풀면 다음과 같은 코드가 나온다.

def solution(players, callings):
    pla_dic = {key: i for i, key in enumerate(players)}

    for p in callings:
        c = pla_dic[p]
        pla_dic[p] -= 1
        pla_dic[players[c-1]] += 1
        players[c-1], players[c] = players[c], players[c-1]

    return players
728x90