감자튀김 공장🍟

[프로그래머스/Lv.1] 완주하지 못한 선수 (with 파이썬) 본문

Algorithm/Programmers

[프로그래머스/Lv.1] 완주하지 못한 선수 (with 파이썬)

Potato potage 2023. 2. 21. 22:15
반응형

✔ 문제

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

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

 

제한사항

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

 

https://school.programmers.co.kr/learn/courses/30/lessons/42576?language=python3 

 

프로그래머스

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

programmers.co.kr


풀이

👼 오답 코드 (효율성 테스트 실패 - 시간 초과)

def solution(participant, completion):
    for i in completion:
        if i in participant:
            participant.remove(i)
    return participant[0]

 

😊 정답 코드

import collections

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

✔ 설명

Conter class 에서는 상호간의 뺄셈 연산을 지원한다 (쉽게 말해서 차집합)

따라서 participant에서 comletion을 빼면 완주하지 못한 한 선수만 남게 된다.

답을 출력하기 위해서는 answer의 keys를 꺼내고, 이를 list로 형 변환 한다음 0번째 인덱스 값을 읽어오면 된다.

list(answer.keys()) 를 했을 경우엔 ["mislav"] 와 같은 답이 출력되기 때문에 리스트의 0번째 인덱스 값을 읽어오도록 하면 된다.


✔ 후기

for ~ in 을 써서 처음 문제는 금방 풀었지만 효율성 테스트에서 다 시간초과로 실패가 떠서 어떤 방법을 써야하나 싶었다.

해쉬 문제라서 딕셔너리를 쓰는 방법도 있었지만 collections.Counter가 더 짧고 친숙해서 해당 라이브러리를 사용했다.

처음엔 set()을 사용하여 차집합을 구현했는데 중복 이름이 없어지는 바람에 제대로 답이 출력되지 않았었다. Counter를 쓰니까 set()처럼 차집합 연산을 사용할 수 있어서 굉장히 편했다.

반응형
Comments