문제 링크: programmers.co.kr/learn/courses/30/lessons/42576
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
하.지.만.. 이 코드는
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번째 버전이 가장 효율이 좋았다!
'Today I Learned > Python 문제풀이' 카테고리의 다른 글
프로그래머스 lv1. 음양더하기 (zip 사용해서 간단하게) (0) | 2023.08.10 |
---|---|
[프로그래머스] lv0. 더크게 합치기 (0) | 2023.06.09 |
[프로그래머스] lv2. 프린터 (0) | 2020.11.16 |
[프로그래머스] Lv2. 기능개발 (스택/큐) (0) | 2020.10.31 |
[프로그래머스] Lv1. 나누어 떨어지는 숫자 배열 (0) | 2020.10.31 |