일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 카테캠
- AI/ML
- ⌨️Developer
- 개발/언어론
- 개발/webrtc
- 개발/보안
- 개발/에러
- 개발/CS/OS
- 개발/컴퓨터네트워크
- 개발/네트워크
- ⌨️Developer/보안
- 개발/Java
- AI/GPT
- ai
- 개발/Tools/프레임워크/Spring
- 개발/CS/알고리즘
- 개발/OOP
- 개발/Electron
- 알고리즘
- electron
- 개발
- 취업
- 개발/환경
- 카카오테크캠퍼스
- 카카오 테크 캠퍼스
- 개발/프레임워크&라이브러리
- 개발/언어/Java
- 개발/Java/Spring
- 대외활동/카카오테크캠퍼스
- 개발/MySQL
Archives
- Today
- Total
봄수의 연구실
Programmers_달리기경주_고범수 본문
문제 요약
"달리기 경주"라는 문제는 매년 열리는 달리기 경주에서 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부르는 해설진의 역할을 수행하는 알고리즘을 구현하는 것입니다.
- 선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열
players
와 해설진이 부른 이름을 담은 문자열 배열callings
가 주어집니다. - 해설진이 선수의 이름을 부르면, 그 선수는 바로 앞의 선수를 추월하게 됩니다.
- 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해야 합니다.
제한사항
players
의 길이는 5 이상 50,000 이하입니다.players[i]
는 i번째 선수의 이름을 의미합니다.players
의 원소들은 알파벳 소문자로만 이루어져 있습니다.players
에는 중복된 값이 들어가 있지 않습니다.players[i]
의 길이는 3 이상 10 이하입니다.callings
의 길이는 2 이상 1,000,000 이하입니다.callings
는players
의 원소들로만 이루어져 있습니다.- 경주 진행중 1등인 선수의 이름은 불리지 않습니다.
입출력 예
- players: [“mumu”, “soe”, “poe”, “kai”, “mine”]
- callings: [“kai”, “kai”, “mine”, “mine”]
- result: [“mumu”, “kai”, “mine”, “soe”, “poe”]
코드
실패 : 시간 초과
def solution(players, callings):
dic = {}
for i in range(len(players)):
dic[players[i]] = i
for c in callings:
for player, position in dic.items():
if position == dic[c] - 1:
dic[player] += 1
break
dic[c] -= 1
# Sort the dictionary by values (positions) and extract the keys (player names)
answer = [k for k, v in sorted(dic.items(), key=lambda item: item[1])]
return answer
딕셔너리에 유저:순서
순으로 입력해서, 마지막에 lambda를 사용해서 정렬하는 Idea였다
callings
배열의 각 요소에 대해dic
딕셔너리의 모든 요소를 순회하므로, 시간 복잡도가 n^2이다.- answer 부분에서 다시, player 수만큼 정렬한다,
정답
def solution(players, callings):
dic = {player: i for i, player in enumerate(players)}
order = list(players) # 선수들의 순서를 저장하는 리스트
for c in callings:
index = dic[c]
if index > 0: # 1등 선수는 추월할 수 없으므로 index가 0보다 커야 합니다.
# 선수 c와 그 앞의 선수의 위치를 바꿉니다.
order[index], order[index - 1] = order[index - 1], order[index]
# 딕셔너리의 선수들의 위치를 업데이트합니다.
dic[order[index]], dic[order[index - 1]] = index, index - 1
return order
아이디어를 살짝 바꿔서, 선수들의 순서를 저장하고, 반복문을 한 번 돌 때 위치 교환까지 한 번에 한다
if index > 0
: 1등 선수는 추월 할 수 없도록 한다- 선수들의 순서와 인덱스를 모두 활용한다
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
728x90
'알고리즘 풀이' 카테고리의 다른 글
Programmers_삼각형의완성조건(2)_고범수 (0) | 2023.07.26 |
---|---|
Programmers_약수의 개수와 덧셈_고범수 (0) | 2023.07.26 |
알고리즘 감 살리기 - 기초 알고리즘 (1) | 2023.05.14 |
CodingTest 감 살리기 with Programmers - 11일차 (0) | 2023.03.20 |
CodingTest 감 살리기 with Programmers - 10일차 (0) | 2023.03.19 |