ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 고득점 kit(유형정리) - 완주하지 못한 선수
    Algorithm/Hash 2023. 1. 23. 11:31
    728x90

    코딩테스트 연습 - 완주하지 못한 선수 | 프로그래머스 스쿨 (programmers.co.kr)

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    문제 설명

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

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

    제한사항
    • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
    • completion의 길이는 participant의 길이보다 1 작습니다.
    • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
    • 참가자 중에는 동명이인이 있을 수 있습니다.
    입출력 예participantcompletionreturn
    ["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
    ["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
    ["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"
    입출력 예 설명

    예제 #1
    "leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

    예제 #2
    "vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

    예제 #3
    "mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

     

     

    ※ 알고리즘

    1. participant와 completion 리스트를 sort() 함수로 정렬한다.

    2. participant와 completion 리스트를 for문 속에서 비교하여 같지 않은 경우 해당 문구를 반환시킨다.

    3. completion 리스트 길이만큼 비교했는데도 찾지 못할 경우 맨 마지막 index의 내용을 반환시킨다.

     

    participant와 completion 리스트에서 단 한명만 차이가 나는 상황을 전제로 던져 준 문제라 기본 알고리즘은 비교만 하면 된다는 생각이 있던 문제 였다. 하지만, 이 문제를 통해 몇 가지 방식을 추가적으로 배울 수 있어서 다른 사람들의 풀이까지도 포스팅 해보려 한다.

     

    <내 풀이>

    def solution(participant, completion):
        
        participant.sort()
        completion.sort()
        
        for i in range(len(completion)):
            if (participant[i] != completion[i]):
                return participant[i]
        
        return participant[-1]

     

    알고리즘 그대로 풀이했다. 처음에 participant의 길이만큼 for문을 돌리다가 index 에러가 한 번 났고, participant[i]를 반환시켜야 하는데 그냥 i 인덱스를 반환시키다가 또 에러를 맞이했다. 문제를 좀 똑바로 읽고 섬세하게 풀 필요성을 느낄 수 있었다. 

     

    <다른 사람의 풀이 1>

    import collections
    
    
    def solution(participant, completion):
        answer = collections.Counter(participant) - collections.Counter(completion)
        return list(answer.keys())[0]

    collections의 Counter를 사용한 풀이이다.

    Counter 함수는 컨테이너등에 동일한 자료가 몇 개인지 확인하는데 사용하는 객체로 dictionary 형태로 객체를 반환한다. 각 리스트를 갯수 객체로 만들어 빼면 한 개의 자료만 남을 것이므로, dictionary의 keys 메서드를 사용하여 [0] 번째 맨 앞의 인덱스를 반환하는 방식이다.

     

    <다른 사람의 풀이 2>

    def solution(participant, completion):
        participant.sort()
        completion.sort()
        for p, c in zip(participant, completion):
            if p != c:
                return p
        return participant[-1]

    내 풀이 방식과 전체적인 방식은 유사하다. 하지만 zip을 사용한 것이 신박하여 들고 와 보았다.

    zip()함수는 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환한. zip을 통해서 participant와 completion 리스트를 p,c로 나타내어 tuple 구조를 만들어 주었다. 해서 p와 c를 비교하여 다르면 바로 return p 해주고 끝까지 돌아야 할 경우는 participant의 마지막 인덱스 내용을 return 해준다. 이렇게 처리를 할 경우 자동으로 해당 리스트의 내용이 들어가므로 index를 적어버리는 것과 같이 내가 했던 실수를 아예 신경 쓸 필요가 없다. 

     

     

    728x90
Designed by Tistory.