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

김아현·2022년 4월 22일
0

문제 보기

🔒 문제

🔐 해결 과정

  1. 매개변수로 주어진 두 배열을 오름차순 정렬한다.
  2. completion 길이만큼 반복하면서 두 배열의 같은 인덱스 값이 같은지 비교한다.
    2-1. 값이 다르면 participant[i] 값을 반환한다.
  3. 반복문이 종료하면 participant[-1] 값을 반환한다.

🔓 풀이 (10m)

2020.

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

2022.04.22

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

🔁 feedback

+ 다른 사람의 풀이

✔️ 해시 사용

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

    return answer

참가자들의 이름을 값으로 하고 해시값을 키로 갖는 딕셔너리 dic와 참가자들의 해시값의 총 합을 담은 변수 temp를 만든다. 이때 동명이인은 해시값이 똑같기 때문에 dic에 중복되지 않은 상태이며, temp에만 값이 중복해서 더해진다. 완주자 이름의 해시값을 temp에서 하나씩 빼다보면 결국 완주하지 못한 선수의 해시값만 남게되므로, 이를 키로 사용해서 이름을 가져올 수 있다.

✔️ collections.Counter 사용

import collections


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

딕셔너리끼리 뺄셈이 가능하다는 사실을 알게되었다,,

profile
Want to be backend developer

0개의 댓글