반응형
프로그래머스 문제
달리기 경주
https://school.programmers.co.kr/learn/courses/30/lessons/178871
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1차 풀이 (실패)
callings를 한꺼번에 딕셔너리형으로 바꿔서 추월 개수만큼 순서를 변경시킨 방법을 사용하려고 했다.
근데 다시 생각해보니 이 방법으로는 문제가 있다.
추월 순서에 따라 순위가 바뀌기 때문에 한 번에 추월 개수를 세면 안 된다!
'''
달리기 경주
callings : 부르면 추월했다는 것을 의미한다!
players : 기존 순서
'''
from collections import Counter # 자동으로 딕셔너리 형태로 value 갯수 세어줌
def solution(players, callings):
answer = []
count = Counter(callings)
#print(count)
for i, v in zip(count, count.values()):
#print(i, v)
index = players.index(i)
del players[index]
players.insert(index-v, i)
answer =players
return answer
기본 테스트는 통과하지만 다른 테스트는 실패!
2차 풀이 (실패)
방법은 맞지만 시간초과가 생겨서 실패!
def solution(players, callings):
answer = []
for j in callings:
num = players.index(j)
#print(num)
players[num-1], players[num] = players[num], players[num-1] # 앞 뒤 swap
answer = players
return answer
ChatGPT 한테 질문해보았다
딕셔너리나 세트를 사용하자!
3차 풀이 (성공)
딕셔너리를 사용해서 성공했다
딕셔너리 2개를 사용하는게 팁인거같다
def solution(players, callings):
answer = []
players_dict = {}
rank_dict = {} # 순서 swap를 위해서 요소를 검색할때
for index, value in enumerate(players):
players_dict[index] = value
rank_dict[value] = index
#print(players_dict, rank_dict)
for j in callings:
call_rank = rank_dict[j] # 부른 선수 순위 가져오기
front_player = players_dict[call_rank-1] # 앞 선수 이름 가져오기
#print(call_rank, j)
#print(call_rank-1, front_player)
players_dict[call_rank], players_dict[call_rank-1] = front_player, j
rank_dict[j], rank_dict[front_player] = call_rank-1, call_rank
#print(rank_dict, players_dict)
answer = list(players_dict.values())
return answer
반응형
'코딩 테스트 > Programmers' 카테고리의 다른 글
[Python] [Level 1] 추억 점수 (0) | 2023.04.12 |
---|---|
[Python] [Level 1] 키패드 누르기 (2020 카카오 인턴십) (0) | 2023.03.30 |
[Python] [Level 2] 주식 가격 (아주 좋은 문제) (0) | 2023.03.28 |
[Python] [Level 2] 주차 요금 계산 (프로그래머스 문제) (0) | 2023.03.26 |
[Python] [Level 1] 공원 산책 (프로그래머스 문제) (0) | 2023.03.26 |