프로그래머스 - 완주하지 못한 선수
- 완주하지 못한 선수
darklight
sublimevimemacs
Python3
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participantcompletionreturn
["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"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
최초 내가 생각한 방법은 for 문 2개를 중첩시켜 참가자와 완주자를 구별하고 if 문을 사용하여 선수를 가려내는 방법으로 시도를 해보았다.
그러나 테스트 자체도 제대로 성공하지 못 했기에, 차라리 구글링을 하고 그거에 대한 해답을 해석하는 것이 더 효율적일 것이라고 생각했다.
def solution(participant, completion):
participant.sort()
completion.sort()
for p, c in zip(participant, completion):
if p != c:
return p
return participant.pop()
해당 코드는 velog.io/@matisse/%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98-python 에서 참고했다.
참가자와 완주자를 우선 sort 로 정렬시킨 뒤 p, c 의 변수를 선언한다.
zip 은 두 리스트간에 동일한 인덱스들은 서로 합치고 그렇지 않은 것은 제외시킨다.
따라서 참가자와 완주자를 zip 하게 되면 두 리스트에 동시에 존재하지 않는, 즉 참가는 했지만 완주는 하지 못한 사람의 이름이 남게 되는데 이럴 if 문을 사용하여 p (참가자) 를 리턴시켰다.
그 후, python 에서 제공하는 pop 함수를 이용하여 남는 사람의 이름을 반환했다.
pop 은 리스트의 해당 인자를 (지정하지 않으면 제일 끝의 인자를) 출력하고 제거한다.
해당 코드는 정확성과 효율성을 모두 통과했다.