Today I Learned/Python 문제풀이

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

하나719 2020. 11. 6. 11:53
반응형

문제 링크: programmers.co.kr/learn/courses/30/lessons/42576

 

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

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

programmers.co.kr

Solution1. for + remove

1) participant 차례로 검사해서 completion에 있는지 확인

2) 있으면 completion에서 해당 선수 지워주기

3) 없으면 해당 선수 return 

 

여기서 굳이 remove 해주었던 이유는, 3번째 입출력을 보면 mislav 라는 선수가 2명이 있다. completion에는 mislav 가 한명이 있는데,

둘 중 한명은 통과하고, 한명은 통과하지 못한것이다. 그런데 단순히 비교해서 completion에 없는 선수를 return 하게 되면, mislav 가 다 통과 했다고 판단되어 null값이 출력된다.

def solution(participant, completion):

    for p in participant:
        if p in completion:
            completion.remove(p)
        else:
            return p

 

하.지.만.. 이 코드는 

효율성 테스트 fail..

for문을 돌면서 하나하나 있는지 없는지 검사하다보니 이중포문이 되어버려 효율성 테스트에서 통과하지 못했다.

 

Solution2. sort + zip

1) participant, completion 정렬해주기

2) for 문으로 p, c 비교해서 값이 다르면 출력

3) 완주하지 못한 선수가 마지막이면 for문 내에서 리턴안됨 -> 리턴 안된 경우 participant의 마지막 사람 리턴

def solution(participant, completion):   
    participant.sort()
    completion.sort()
    for p,c in zip(participant,completion):
        if p != c:
            return p
    return participant[-1]

for문 검사할 때 sor()로 정렬해준뒤에 한쌍씩 검사하니까, solution1처럼 이중포문이 되지 않아서 효율이 올라간다.

정확성에서도 코드 속도가 빨라졌다!

Solution3. Collections 모듈 사용

1) colletions 임포트

2) participant와 completion counter 각각 구해서 빼주기

3) 남은 딕셔너리에 있는 key (사람이름) 구해주기 

import collections
def solution(participant, completion):

    c=collections.Counter(participant)-collections.Counter(completion)
    return list(c.keys())[0]

3가지 풀이중에 마지막 풀이가 가장 간결하고 간단해 보이는데, 2번째 버전이 가장 효율이 좋았다!

반응형