[Programmers][Py] 완주하지 못한 선수

mj·2024년 7월 31일
0

코딩테스트문제

목록 보기
41/50

✅ 문제

문제 바로가기



✅ 나의 풀이


def solution(participant, completion):
    # 1. 리스트 정렬
    participant.sort()
    completion.sort()
    
    # 2. 없는 사람 찾기
    for i in range(len(participant) - 1):
        if participant[i] != completion[i]:
            return participant[i]
    
    # 예외처리 - 완주하지 못한 선수가 맨 마지막에 있는 경우 
    return participant[len(participant) - 1]

완주하지 못한 선수가 Participant 배열의 마지막 index에 있는 경우 따로 처리가 필요함에 주의.



✅ 다른 풀이


1. Counter 사용

def solution(participant, completion):

    answer = collections.Counter(participant) - collections.Counter(completion)
    
    return list(answer.keys())[0]
  • 딕셔너리는 -가 불가능하지만 Counter객체는 -연산이 가능하다.



2. Hash 함수 사용

hash()

파이썬의 내장 함수 hash()는 객체의 해시 값을 반환하는 함수이다.
hash() 함수는 같은 객체에 대해 항상 같은 해시 값을 반환한다.

알고리즘

  1. 각 선수의 이름에 대하여 해시값을 구하고 이를 key=해시값, value=이름으로 딕셔너리에 저장한다.
  2. participant 의 hash값의 합 구하기
  3. completion 의 hash값 빼기

무조건 한명만이 완주하지 못한다고 했으므로, 빼고 남은 값이 미완주자의 해시값이다.

def solution(participant, completion):
    sum = 0
    dic = {}

    # 1. 딕셔너리 만들기 / 2. hash값의 합 sum 구하기
    for part in participant:
        dic[hash(part)] = part
        sum += int(hash(part))

    # 3. completion의 sum(hash) 빼기
    for comp in completion:
        sum -= hash(comp)

    return dic[sum]



Comment

hash문제였던만큼 hash로 푸는 것이 출제의도였던것 같다. hash()를 처음 사용해보았는데 hash값의 합과 빼기 연산을 통해 값을 구할 수 있다는 것이 인상적이었다.


참고 ) https://coding-grandpa.tistory.com/85

profile
일단 할 수 있는걸 하자.

0개의 댓글