[Python] 완주하지 못한 선수

2020. 1. 10. 00:17Python 기초/Python_Algorithm

문제 설명

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

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

제한사항

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

 

집중 포인트 : 단 한 명의 선수, 완주하지 못한 선수의 이름, 선수 이름은 알파벳 소문자, 동명이인

 

문제를 보고 가장 먼저 드는 생각은 참가한 선수 명단에서 완주한 선수 명단를 빼면 되지 않을까?였습니다. 하지만 리스트끼리는 빼기(-) 연산이 불가능하죠. 딕셔너리도 마찬가지로 빼기(-) 연산이 불가능 합니다. 이를 가능하게 하기 위해 python에서 제공하는 collection 모듈의 Counter() 함수를 사용해도 되지만, 이를 모르는 경우에는 다음과 같이 풀 수 있습니다. 

 

딕셔너리의 keys() 함수와 items()함수를 통해 만들어진 <class 'dict_keys'>와 <class 'dict_items'>은 빼기 연산이 가능합니다. 이를 활용하여 구성한 전체 코드는 다음과 같습니다. 

def solution(participant, completion): # 리스트 두 개를 인자로 받는다.
    answer = '' # 답변 받을 빈 string
    p_dict = {} # 참가자 dict
    c_dict = {} # 완주자 dict
    
    for i in participant: # participant의 요소(i)를 하나씩 꺼내서
        if i not in p_dict: # 만약에 i가 p_dict에 키 값으로 존재 하지 않는다면,
            p_dict[i] = 0 # p_dict의 키값을 i로, 밸류 값은 0으로
        p_dict[i] += 1 # p_dict의 i 키값의 밸류에 1을 더해준다. (동명이인 고려)
    
    for i in completion: # 위와 동일 
        if i not in c_dict:
            c_dict[i] = 0
        c_dict[i] += 1
    
    # 빼기 연산을 위해 items() 를 사용
    p_items = p_dict.items() 
    c_items = c_dict.items()
    
    # 1. items 끼리 빼기 연산 수행
    # 2. dict 타입으로 변경
    # 3. dict.keys() 함수로 key 값만 추출 
    # 4. list 타입으로 변경
    # 5. 완주하지 못한 선수는 단 한명이므로 인덱스 [0]
    answer = list(dict(p_items - c_items).keys())[0]
    
    return answer

'Python 기초 > Python_Algorithm' 카테고리의 다른 글

[Python] 베스트 앨범  (0) 2020.04.26
[Python] 위장  (0) 2020.04.26
[Python] 2019 KAKAO BLIND RECRUITMENT, 실패율  (0) 2020.01.17
[Python] 체육복  (0) 2020.01.10