🐍PYTHON/알고리즘

[Python] 프로그래머스 완주하지 못한 선수 Level 1. 파이썬 코드

wooaoe 2020. 8. 19. 20:05

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

 

💡 나의 풀이 

처음엔 for문을 p,c 둘다 돌려서 p에서 c를 빼려고 했는데 파이썬다운 코드가 아닌 것 같아서(동명이인 처리도 안되고) 
Dictionary로 해결하려고 했으나 사용방법이 미숙하여 결국 검색을 통해 알아낸 엄청난 모듈..! 

'Collections'

  • import collections 
  • collections에 내장된 함수인 Counter()는 Dic과 같이 hash형 자료들의 값의 개수를 셀 때 사용 
  • Dic처럼 {key:value} 형식으로 만들어짐 
  • Counter() 객체끼리 빼는 것도 가능
  • 0 (zero) 나 음수 (minus)의 값들도 가능
  • 해당하는 값이 없더라도 error가 아닌 0을 반환
import collections
lst = ['aa', 'cc', 'dd', 'aa', 'bb', 'ee']
print(collections.Counter(lst))
'''
결과
Counter({'aa': 2, 'cc': 1, 'dd': 1, 'bb': 1, 'ee': 1})
'''


출처: https://excelsior-cjh.tistory.com/94 [EXCELSIOR]

 

  • 위의 코드처럼 Counter는 원소의 등장 횟수가 value가 되고, 원소가 key값이 된다.

💡 풀이 

import collections

def solution(p, c):
    p.sort()
    c.sort()
    result = collections.Counter(p) - collections.Counter(c)
    
    return list(result)[0]

 

  • Participant의 동명이인이 있다면 {"mislav":2}가 되고, Completetion의 mislav는 {"misav":1}이기 때문에 연산 과정에서 1개만 남게된다. 동일한 횟수라면 0이 되어 사라지게 된다. (정렬 우선)
  • 완주하지 못한 선수는 1명으로 정해져 있기 때문에 반환값을 list로 치환후 [0]째 값을 가져온다.

 

💡 다른 사람의 풀이 

def solution(participant, completion):
    answer = ''
    temp = 0
    dic = {}
    for part in participant:
        dic[hash(part)] = part
        temp += int(hash(part))
    for com in completion:
        temp -= hash(com)
    answer = dic[temp]

    return answer

 

  • hash() : return the hash value of the object (if it has one)
  • hash()는 각 값에 대한 고유한 정수형 숫자를 반환해준다. 
  • 따라서 고유한 값 = key, list 값 = value가 되어 Dictionary 형태로 담기게된다. participant의 hash값을 temp에 다 더해준 뒤, completetion의 hash값을 빼준다. 연산된 temp를 dic의 key로 불러와 answer에 담아주고 반환하면 완주하지 못한 선수가 나오게 된다. (동명이인 문제도 해결) 

 

세상엔 천재가 너무 많아..