카테고리 없음
프로그래머스 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