문제 주소
https://programmers.co.kr/learn/courses/30/lessons/42576
코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
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단계 문제이다.
해시는 Key-value쌍으로 데이터를 저장하는 자료구조인데
굳이 해시를 사용하지 않아도 충분히 풀 수 있는 문제였다.
이 문제는 중복된 참가자 이름을 골라내는 것이 관건이었다.
중복된 이름을 골라내기 위해 딕셔너리를 이용했지만
딕셔너리는 중복을 제거하는 것이지 골라내는 것이 아니라 포기했다.
그다음으로 생각한 것은 zip 함수다.
먼저 participant와 completion을 sort함수로 정렬한 후 zip함수로 앞에서부터 묶었다.
완주한 사람이라면 완주자와 참가자가 한 팀씩 묶이게 되며 만약 다르면
완주하지 못한 이름이 중복된 참가자 거나 완주하지 못한 참가자이므로 return 하도록 하였다.
그리고 완주하지 못한 참가자의 이름이 정렬했을 때 마지막에 존재하게 되면
위에서 찾지 못하므로 마지막 줄에
return participant[-1]
을 넣어줬다.
해답
def solution(participant, completion):
participant.sort()
completion.sort()
for i, j in zip(participant,completion):
if i != j:
return i
return participant[-1]
이후
해시 문제이지만 해시로 풀지 않았다.
그래서 좀 아쉬워 나중에 해시 방식으로 다시 풀어보고 싶었다.
그리고 다른 사람의 풀이들을 보고 분석하며 내 코드가 한없이 초라보였다.
좀 더 깔끔하고 간결하게 만들 필요가 있다.
'공부방 > 코딩테스트 연습' 카테고리의 다른 글
프로그래머스 - 신규 아이디 추천 (with 파이썬) (0) | 2021.04.18 |
---|---|
프로그래머스 - K번째수 (with 파이썬) (0) | 2021.04.17 |
댓글