🔔 문제

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

문제 설명

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

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

제한사항

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

입출력 예

participant completion return
[“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”는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

출처


📝 접근과정

이것도 그 전에 풀다가 종료한 상태의 코드가 남아 있었다.

각각 리스트 정렬을 해준 뒤에 서로 짝을 지어 비교해보고 없는게 있으면 리턴해주면 된다는 생각을 했다.

파이썬에서 짝을 지어주는 함수가 있는지 몰랐는데, 구글에 검색을 해보니 zip이라는 함수가 있다는 것을 알게 되었다. 이 함수를 이용해서 접근하면 풀릴 것 같아서 시도해봤고, 풀 수 있었다.
(설명은 코드 블럭에 주석으로 달아놓았음)


🔐 해결 (소스 코드)

def solution(participant, completion):
    participant.sort()
    completion.sort()

    for part, comp in zip(participant, completion): 
    '''
    zip : 배열을 같은 인덱스끼리 짝지어줌, 
          배열의 길이가 다른 경우 같은 인덱스끼리만 짝지어주고, 나머지 인덱스는 zip객체에서 제외.
    '''      
        if part != comp:
            return part
    return participant[-1] # or return participant.pop()

😓 후기

한동안은 자바나 자바스크립트로 코드를 짜다 보니까, 파이썬의 막강함을 잊고 있었던 것 같다.
(역시 파이썬…)

오늘 문제를 풀면서 새롭게 zip함수에 대해서 알게 되었고, 해시 문제를 풀 때 굉장히 유용한 함수라는 것을 알게 되었다.

문제를 풀고나서 다른 분들의 풀이도 보았다. 특히 collections.Counter를 이용한 풀이를 많이 보았는데,
이 방법으로 굉장히 간결한 코드로 해결할 수 있더라…

# 날짜: 2022-06-08 
# 스스로 먼저 이해 한 후 해당 풀이 추가 업로드
import collections

def solution(p, c):
    p.sort()
    c.sort()
    result = collections.Counter(p) - collections.Counter(c)
    
    return list(result)[0]
# Participant의 동명이인이 있다면 {"mislav":2}가 되고, Completetion의 mislav는 {"misav":1}이기 때문에 연산 과정에서 1개만 남게된다. 동일한 횟수라면 0이 되어 사라지게 된다. (정렬 우선)
# 완주하지 못한 선수는 1명으로 정해져 있기 때문에 반환값을 list로 치환후 [0]째 값을 가져온다.

*출처 : https://wooaoe.tistory.com/71 [개발개발 울었다:티스토리]

이번 문제를 풀면서 새로운 함수(zip)를 알게 되었고, 또 내가 유용하게 쓸 수 있는 모듈(collections)의 존재에 대해서도 알았다.

이번에 안 것은 잘 숙지하고, 모르는 것은 더 알아가면서 앞으로 문제를 좀 더 쉽고, 효율적으로 잘 풀 수 있기를 바란다.

너무나 부족한 나… 좋은 개발자가 되기 위해서 아직 갈 길이 멀다 😥

화이팅 💪🤗

맨 위로 이동하기

Leave a comment