완주하지 못한 선수(python)

이민호·2021년 3월 6일

나의 풀이1

  1. 참가한 사람과 완주한 사람구별
  2. 참가한 사람이 완주한 사람 목록에 포함되어 있나 확인
  3. 없으면 그 값이 정답
def solution(participant, completion): 
	for i in participant:
  		if participant not in completion:
  			return participant

결과는 실패... 동명이인을 고려하지 못하였다.

나의 풀이2

collections 의 Counter를 이용

participant 와 completion을 합한 뒤 Counter를 이용하여 값이 value 값이 2가 아닌 수를 찾아내는 방법

from collections import Counter
def solution(participant, completion):
    all = participant + completion
    all2 = set(participant + completion)
    for i in all2:
        if Counter(all)[i] != 2:
            return i

이것또한 실패
테스트에서 실패일뿐만 아니라 모두 시간초과가 뜬다;;

정답

1. collection을 이용하는 방법

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

알게된점

Counter 끼리 -를 이용하여 값을 알아낼 수 있다.

ex)
participant =Counter({'marina': 2, 'josipa': 1, 'nikola': 1})
completion = Counter({'marina': 1, 'josipa': 1, 'nikola': 1})
collections.Counter(participant) - collections.Counter(completion) =
Counter({'josipa': 1})

2. zip를 이용하는 방법

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for p,c in zip(participant, completion):
        if p != c:
            return p
    return participant.pop()

1. 동명이인 없는 경우

예)
participant = ["marina", "josipa", "nikola"]
completion = ["marina", "josipa"]

for p,c in zip(participant, completion):
        if p != c:
            return p

p와 c의 결과값

   p        c
marina    marina
josipa    josipa

즉, p와 c가 모두 같으므로 participant의 마지막 값이 정답이다.

return participant.pop()

2. 동명이인이 있는 경우

예)
participant = ["marina", "josipa", "nikola", "marina"]
completion = ["marina", "josipa","nikola"]

p와 c의 결과값

   p        c
marina    marina
marina    josipa
josipa    nikola

marina가 중복이므로 p의 marina 와 jospia가 맞지 않다.
marina인 p값을 반환한다.

profile
life is fun

0개의 댓글