노트 :

[프로그래머스] 완주하지 못한 선수 본문

Algorithm

[프로그래머스] 완주하지 못한 선수

IT_달토끼 2022. 9. 30. 17:55

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

 

프로그래머스

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

programmers.co.kr

 

[문제 설명]

 

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"는 참여자 명단에는 두 명이지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

[첫번째 시도] 효율성 테스트 실패

def solution(participant, completion):
    for person in participant:
        if person in participant:
            if participant.count(person) != completion.count(person):
                return person
        else:
            return person

for문과 containment문을 사용하여 participant 배열에는 속해있지만, completion에는 속해있지 않은 선수 이름을 반환한다.

동명이인이 있을 수 있으므로 count 함수를 사용하여 participant 배열의 선수 수와 completion 배열의 선수 수를 비교한다.

같지 않다면, 해당 선수 이름을 반환한다.

 

이 방법으로 정확성 테스트는 통과했지만, 효율성 테스트에서 시간초과로 실패하였다.

 

[두번째 시도] 효율성 테스트 실패

def solution(participant, completion):
        for person in participant:
            if participant.count(person) != completion.count(person):
                return person

처음 시도했던 방법을 좀더 단순화하였다.

containment문을 사용없이, 바로 participant 배열과 completion 배열 요소의 개수를 비교하였다.

일치하지 않는다면, 해당 선수명을 반환하는 방식을 사용하였으나 여전히 시간초과로 실패ㅠ

전혀 다른 방식으로 풀어야 한다는 것을 깨달았다.

 

[세번째 시도] 효율성 테스트 실패

def solution(participant, completion):
    p_set = set(participant)
    p_dict = {}
    for p in p_set:
        p_dict[p] = participant.count(p)
    print(p_dict)
    for c in completion:
        p_dict[c] -= 1
    print(p_dict)
    for i in p_dict:
        if p_dict[i] != 0:
            return i

participant의 선수명을 키로, 동명이인의 수를 값으로 가지는 딕셔너리를 만들었다.

이후 completion의 요소를 for문으로 돌면서 해당 요소를 키로 가지는 딕셔너리의 값을 하나씩 줄인다.

최종적으로 딕셔너리의 값이 0이 아닌 키를 반환한다.

 

그런데!!!

이 방법도 효율성 테스트에서 실패했다ㅠㅠㅠ

 

좀더 고민해봐야겠다...