2019. 10. 6. 23:56

[python]완주하지 못한 선수

문제 설명


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

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

 

제한사항


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

문제 풀이


처음에는 배열 participant에 배열 completion이 포함되어 있지 않은 것만 따로 answer 배열에 넣어서 그 배열을 최종 리턴하려고 했다.

그런데 동명이인의 경우에는 둘다 사라진다는 치명적인 단점이 존재했고 그래서 동명이인을 찾아서 그냥 그 동명이인을 마지막에 answer에 추가해주면 되겠지하고 동명이인 찾는 함수를 만들어서 answer에 동명이인을 넣어줬다.

그러나 그 편법으로는 1,2,3번 예제는 통과했지만 정확성과 효율성 테스트에서 실패했다.

def find_overlap(array):
    data = ""
    length = len(array)
    for i in range(0, length-1):
        for j in range(i+1, length):
            if array[i] == array [j]:
                data += array[i]
            break
    return data
def solution(participant, completion):
    partiset = set(participant)
    answer = ""
    for i in participant:
        if i in completion:
            print()
        else:
            answer += i
    if len(partiset) == len(completion):#중복제거한 배열과 완주한 배열의 크기가 같다면
        answer += find_overlap(participant)
    return answer

코드도 난잡하고 하드코딩식이라서 내가 너무 어렵게 하는게 아닌가 생각이 들었고 검색을 통하여 Collections 함수의 Counter 메소드를 알게되었다.

Counter를 이용하면 배열간에 더하거나 빼거나 교집합, 합집합 등의 연산이 가능하다.

다른 예라면 몰라도 완주를 못한 사람은 반드시 한 명 이라는 조건이기 때문에 이 경우에는 그냥 참가자에서 완주자의 목록만 빼주면 그 완주 못한 한 명을 구할 수 있다.

import collections
def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    for key in answer:
        return key

그러면 이렇게 간단한 코드를 얻을 수 있다. 참고해두어야할 것은 Counter 메소드는 항상 딕셔너리 타입으로 리턴하기 때문에 우리가 원하는 키값만을 받기 위해서는 list(answer.key())[0] 이렇게 하거나 위처럼 for문으로 key값을 추출하자 사실 for문을 돌릴 필요도 없이 0번째 밖에 키 값이 안들어있기 때문에 for문은 사실 오용에 가깝다.

'Programming > Algorithm' 카테고리의 다른 글

[python]삽입 정렬  (0) 2019.10.16
[python]선택 정렬  (0) 2019.10.15
[python]팩토리얼과 재귀함수  (0) 2019.10.11
[python]K번째수  (0) 2019.10.10
[python]모의고사  (0) 2019.10.08
[python]완주하지 못한 선수  (0) 2019.10.06