알고리즘/문제 풀이

[Python/파이썬 프로그래머스] 완주하지 못한 선수

광규니 2021. 5. 1. 13:00
반응형

풀이

1차 시도 (실패)

문제를 보고 효율성이 있는 문제라 고민을 많이 했다...

정렬을 한 뒤 이분 탐색으로

조건을 참가자 인덱스 != 완주자 인덱스 and 참가자 인덱스-1 == 완주자 인덱스-1

주면 될 줄 알았는데 

효율성에서 빵점....

뭐지...?

def solution(participant, completion):
    answer=''
    participant.sort()
    completion.sort()
    s,e=0,len(completion)-1
    i = 1
    queue=deque()
    queue.append((s,e,i))
    while queue:
        s,e,i=queue.popleft()
        m = (s + e) // 2 
        i += 1
        if participant[m] != completion[m] and participant[m-1]==completion[m-1]:
            answer=participant[m]
            break
        elif s==e:
            break
        else:
            queue.append((m+1,e,i))
            queue.append((s,m-1,i))
    if answer=='':
        answer=participant[-1]
    print(answer)

 

2차 시도

그냥 정렬시킨 뒤

참가자 인덱스 != 완주자 인덱스 return

안되면 참가자[-1]시켜줬더니

성공했다.. 단순하게 해야하나...

def solution(participant, completion):
    answer=''
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i]!=completion[i]:
            return participant[i]
        
    return(participant[-1])

 

참고 답안

import collections


def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

counter 함수를 사용... (전에 본 적이 있는데 써본 적이 없다...)

counter 함수란 리스트의 요소 개수를  Dictionary형태로 반환하여 준다.

ex)

lst= ['a', 'b', 'c']
print(collections.Counter(lst))
------------------------------------------
결과
Counter({'a': 1, 'b': 1, 'c': 1})

counter로 요소의 개수를 세주고

참가자-완주자 하게되면 완주하지 못한 선수 한명만 남게되므로

형변환 시켜준 뒤 return

 

counter 사용법 외우기!!!

반응형