본문 바로가기
‼ ERROR RECORD

마라톤 완주 못한 선수 찾기 코테 _ Counter, List Subtraction

by Queen2 2022. 6. 16.
728x90
반응형

 

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

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

 

코딩테스트 연습 - 완주하지 못한 선수

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

programmers.co.kr

구현 필요한 기능

1) List와 List간의 교집합 파악 필요 -> 단,중복값을 별개의 값으로 카운팅해야함


  • 기존의 에러코드
def solution(participant, completion):
    answer= ''
    for i in participant:
    	if i not in completion:
             answer += i
    return answer

 결과괎 이슈 : 중복값이 별개의 값으로 카운팅되지 않음

접근방식: 값을 하나만 substract하는 특징을 가진 함수는 remove이기 때문에, participant.remove(i) 형식의 접근을 했더니 list간의 길이 불균형으로 null값이 나왔다.

 

  • 해결방안

List간의 subtraction 할 수 있는 방안을 stackoverflow에서 힌트를 얻어서 collections 모듈의 counter을 사용했다.

https://stackoverflow.com/questions/3428536/python-list-subtraction-operation

from collections import Counter
def solution(participant, completion):
    answer= ''
    for i in list((Counter(participant)-Counter(completion)).elements()):
        answer += i
    return answer

 

  • 셀프 피드백

쉬운 문제라고 생각했지만 중복값을 하나의 값으로 취급하지 않아야 한다는 허들이 있었다.

문제상황을 주의 깊게 보고 제약 조건에 대한 고려가 필요하다

 

  • 정답 코드
import collections


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

 

정답 역시 collections를 이용했다. 다만, 값을 반환할때 list로 값이 리턴되지 않도록 key값에서 [0] 인덱스 설정을 통해 오류가 나지 않도록했다. collections모듈이 기본적으로 딕셔너리 형태임을 알아야 이런 접근이 가능한 것 같다.


Class collections.Counter

https://docs.python.org/ko/3/library/collections.html#collections.Counter

 

collections — 컨테이너 데이터형 — Python 3.10.5 문서

collections — 컨테이너 데이터형 소스 코드: Lib/collections/__init__.py 이 모듈은 파이썬의 범용 내장 컨테이너 dict, list, set 및 tuple에 대한 대안을 제공하는 특수 컨테이너 데이터형을 구현합니다. named

docs.python.org

Counter(값) ==> {'어떤 값이': 몇개 있다}는 dict 형태의 컬렉션에 해당함

단, 딕셔너리 형태와 유일한 차이점은 null값이 아니라, 0을 반환한다는 점

 

Counter().elements() : 반복 항목에 대한 iterator반환

Counter().most_common(n개): 가장 빈도가 높은 순으로 나여한 리스트를 top n개 까지 반환

Counter().subtract() : 매핑되는 요소의 '개수'value를 뺌

Counter().total() : 전체 count의 합을 더함

728x90
반응형

댓글