Q. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
https://programmers.co.kr/learn/courses/30/lessons/42576?language=python3
구현 필요한 기능
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
Counter(값) ==> {'어떤 값이': 몇개 있다}는 dict 형태의 컬렉션에 해당함
단, 딕셔너리 형태와 유일한 차이점은 null값이 아니라, 0을 반환한다는 점
Counter().elements() : 반복 항목에 대한 iterator반환
Counter().most_common(n개): 가장 빈도가 높은 순으로 나여한 리스트를 top n개 까지 반환
Counter().subtract() : 매핑되는 요소의 '개수'value를 뺌
Counter().total() : 전체 count의 합을 더함
'‼ ERROR RECORD' 카테고리의 다른 글
Leetcode 02. Add Two Numbers (0) | 2022.09.15 |
---|---|
Leet code #1 Two Sum > 수식의 역발상과 enumerate사용 (0) | 2022.09.12 |
Leet code #94 Binary Tree Inorder Traverse (DFS, BFS) (0) | 2022.09.10 |
빅데이터 분석기사 응시환경체험 작업형 1번 예제 (0) | 2022.06.23 |
소수만들기 코테 Error _ for문 끊기의 이해, itertools (0) | 2022.06.15 |
댓글