본문 바로가기
프로그래밍/알고리즘 문제

[프로그래머스] 해시 - 완주하지 못한 선수 (python)

by 잇서니 2019. 8. 27.
반응형

1차시도 리스트로 노가다

def solution(participant, completion):
    answer=""

    for i in participant:
        if len(completion)==False:
            answer=i
            break
        for j in range(len(completion)):
            if i==completion[j]:
                flag=True
                completion.pop(j)
                break
            else:
                flag=False
        if flag==False:
            answer=i
            break

    
    return answer

 

아이디어

  • participant 참가자 한 명씩 completion 명단에 있는지 확인합니다. 
  • 있으면 그 다음 참가자가 확인하고, 없으면 completion 명단 끝까지 없는건지 확인합니다.

틀린이유

  • 효율성 테스트 실패
  • pop(j) 가 오래 걸릴 것이고, for문이 많습니다.

2차시도 딕셔너리 사용

def solution(participant, completion):
    answer=""

    dic_completion=dict(zip(completion,range(len(completion))))
    
    for i in participant:
        if i in dic_completion:
            del dic_completion[i]
            continue
        else:
            answer=i
            break

    
    return answer

 

아이디어

  • 완주한 선수들 (completion)을 key값으로 하여 딕셔너리를 만듭니다.
  • 참가 선수(participant) 한 명씩 딕셔너리 key값에 포함되어 있는지 판단합니다.

틀린이유

  • 완주한 선수 중에 동명이인이 있는 경우를 처리하지 못했습니다.
  • 완주한 선수를 key값으로 하는 딕셔너리를 만들 때, 중복되는 key는 1개만 들어가게 됩니다.
  • sunny(1)라는 참가선수가 완주했을 때 del dic_completion["sunny"] 가 수행되면, sunny(2)라는 참가선수가 완주했음에도 불구하고 dic_completion key값에 sunny가 없으므로 완주하지 못했다고 나오게 됩니다.

 

다른 분들의 코드 (1)

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

 

아이디어

  • 배열을 정렬한 후에 비교합니다. (디폴트는 오름차순)
  • return participant[len(participant)-1] 를 통해서 참가자 명단에 제일 마지막 선수가 완주하지 못하는 경우를 커버합니다. 
  • 저는 반복문을 빠져나올 때 break만 생각했었는데, 아예 return으로 함수 종료를 하면 되네요.

다른 분들의 코드 (2)

import collections


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

 

아이디어

  • collections라는 모듈이 있다네요 .. 참
  • 거기에 Counter라는 서브클래스가 있대요.. 참
  • A Counter is a dict subclass for counting hashable objects.

파이썬개념

1) 리스트 정렬

sort() sorted()
a_list.sort() new_list=sorted(a_list)
기존의 리스트 자체를 정렬

기존 리스트에는 영향이 없음

새로운 리스트를 만들어 리턴함

2) collections.Counter()

import collections

a=["hi","sunny","hi"]
print(collections.Counter(a))
# Counter({'hi': 2, 'sunny': 1})

print(collections.Counter(a[1]))
# Counter({'s':1,'u':1,'n':2,'y':1})

https://excelsior-cjh.tistory.com/94

반응형

댓글