(Python)달리기 경주 (프로그래머스 Lv.1)
달리기 경주 (프로그래머스 Lv.1)
https://school.programmers.co.kr/learn/courses/30/lessons/178871
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
처음으로 푼 코드
def solution(players, callings):
answer = []
for call in callings:
for i, player in enumerate(players):
if call == player :
ept = players[i]
players[i] = players[i-1]
players[i-1] = ept
answer = players
return answer
그러나 테스트 7~테스트13까지 시간초과로 오류가 발생했다.
players의 최대 길이가 5만, callings의 최대길이가 100만이니까. 이러면 최악의 경우 players의 끝 인덱스까지 100만번 순회하므로. 그럼 5만 * 100만이 원하는 값을 반환하는데 소요하고 그중 4만9999 * 100만이 원하는 값을 찾는데 소요한다. . 즉, 값을 찾는시간을 줄여야 한다는 것..
그래서 딕셔너리를 이용해보기로 했다.
그렇게 만든 두번째 코드..!
def solution(players, callings):
answer = []
rank = {}
for i, player in enumerate(players):
rank[player] = i
for call in callings:
fir_index, sed_index = rank[call]-1, rank[call]
players[fir_index],players[sed_index] = players[sed_index],players[fir_index]
rank[players[fir_index]], rank[players[sed_index]] = rank[players[fir_index]]-1,rank[players[sed_index]]+1
answer = players
return answer
players = ["mumu", "soe", "poe", "kai", "mine"]
callings = ["kai", "kai", "mine", "mine"]
print(solution(players, callings))
딕셔너리의 활용법이나 enumerate함수를 까먹어서 서칭을 좀 많이 했지만 결국 완료.
이 부분에 대해 헷갈린 부분은 아래 링크로 정리해두었다.
https://star-ccomputer-go.tistory.com/36
(enumerate함수)for문에서 횟수와 객체를 동시에 가져오고 싶을때
rank = {} for i, player in enumerate(players): rank[player] = i 위와 같이 딕셔너리 같은 곳에 사용하기도 참 좋은 것같다.
star-ccomputer-go.tistory.com
https://star-ccomputer-go.tistory.com/35
딕셔너리 key, value값으로 정렬, 딕셔너리 리스트로 만들기
딕셔너리 key, value값으로 정렬 1. key값으로 정렬하는 방법(d가 원래의 딕셔너리) 만약 d2 = sorted(d) 로 한다면 value값이 빠지고 key값만 정렬된 리스트를 얻게 된다 따라서 맞는 코드는 이렇게! d1 = dic
star-ccomputer-go.tistory.com