본문 바로가기

코딩

프로그래머스 - 코딩테스트 고득점 Kit - 해시 - 완주하지 못한 선수 (python)

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42576

일단 중요한 제한 사항을 보자면 아래 2가지가 있습니다.

 

1. completion의 길이는 participant의 길이보다 1 작습니다.

2. 참가자 중에는 동명이인이 있을 수 있습니다.

 

1 조건을 이용하여 문제를 풀기 위해 set을 이용했습니다.

 

1) 만약 participant과 completion 내에 동명이인이 없다면

len(set(participant)) == len(set(completion))+1 을 충족할 것이고

 

2) 만약 participant 내에 동명이인이 있다면

len(set(participant)) == len(set(completion)) 을 충족할 것입니다.

 

따라서 차집합을 구하는 difference를 이용하여  두 개의 케이스로 나누어 보았습니다.

그래서 만약 1)이라면 아래 코드의 a에는 완주하지 못한 선수의 이름만이 저장될 것이고

 

2)라면 분명 어떤 한 이름에 대한 동명이인의 수가 다른 경우가 있으므로 

ex)  participant에는 "kiki"가 3명, completion에는 "kiki"가 2명인 경우

 

해당 경우를 for문을 이용하여 찾으면 됩니다. (count: 리스트 내에 특정 원소가 몇 개있는지 센다.)

def solution(participant, completion):
    answer = ''
    #case 1
    p = set(participant)
    c = set(completion)
    a = p.difference(c)
    if len(a) != 0: 
        return a.pop()
    #case 2
    else:
        for i in range(len(completion)):
            if completion.count(completion[i]) != participant.count(completion[i]):
                return completion[i]
    return answer