728x90


📌  풀이 1

우선 정렬을 하면 비교가 되겠다고 생각했다.

Participant와 Completion을 정렬하여 zip으로 묶어 for문으로 비교하여 만약 서로 다른 원소가 있다면 그 중 Participant에 있는 원소가 완주하지 못한 선수 이므로 해당 원소를 return해준다. 

 

근데 여기서 한가지 조심해야 할 점이 있는데, Completion은 Participant보다 항상 길이가 1 적으므로 만약 완주하지 못한 선수가 정렬된 Participant의 가장 마지막에 있다면 for문이 돌아가지 않는 것이다. 

나는 문제에 모든 참가자 이름은 소문자로 되어 있다는 조건을 보고 Completion의 마지막에 

completion.append("A")

로 대문자를 추가해주는 (그 어떤 Participant와도 겹치지 않게) 급약처방으로 문제를 해결했다.

 

코드

def solution(participant, completion):
    participant.sort()
    completion.sort()
    completion.append("A")
    for a, b in zip(participant, completion):
        if a != b:
            return a

 

 

 

 

📌  풀이 2

문제 자체가 해시 탭에 있던 만큼 해시로 푸는 방법도 찾아 풀어보았다.

 

  • HashMap이란 Key-Value의 Pair를 관리하는 클래스이다.
  • 이 문제에서 Key는 hash한 값이 되겠고, Value는 각 선수의 이름으로 해둔다.
  • 이 문제에서는 각 이름의 Hash 값을 구하고, 이 값들의 합을 구한다.
  • 그렇게 합해진 sumHash에서 완주자들의 Hash를 빼게 되면 완주하지 못한 선수의 Hash 값만 남게 되므로 그 Hash의 Value를 찾아 return 해준다.

해시값을 구하는 방법은 파이썬 에서는 hash() 를 이용하면 된다.

participates = ["marina", "josipa", "nikola", "vinko", "filipa"]

for part in participates:
    print(hash(part))
    
# 출력값
# -1541679985880489017
# -1326818124714316101
# -5566190426662992184
# 9198256884072924095
# -4314736286899648945

을 출력해보면 위와 같이 해싱함수로 계산된 해시값들이 출력되는 것을 확인할 수 있다.

 

코드

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

    for com in completion:
        temp -= hash(com)

    return dic[temp]



 

 

복사했습니다!