[프로그래머스] 해시 | 완주하지 못한 선수 | Level 1 | 파이썬(Python)

letthem·2025년 1월 6일

CodingTest

목록 보기
5/24
post-thumbnail

문제

문제 설명

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

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


풀이

초기 풀이

  • 우선 하나만 차이가 나고 비슷하게 생겼으니 최대한 간단하게 만들기 위해서 두 배열 다 sort로 정렬해본다.
  • completion 길이가 하나 더 짧으니 completion 길이만큼 도는 동안 각 요소 [i]번째를 비교해보고 다르면 정답이 된다.
  • 비교했는데 모두 같으면 마지막 것이 무조건 다르므로 정답이 된다.
def solution(participant, completion):
    answer = ''
    participant.sort() # 정렬
    completion.sort() # 정렬
    
    for i in range(len(completion)):
        if participant[i] != completion[i]: # 다르면 정답
            answer = participant[i]
            break # a b c d e VS a b d e 일 때 c가 정답이지만 d랑 e가 또 비교하기 전에 탈출해야 한다.
        elif participant[-1] == completion[-1]: # a c b b b VS a c b b
            answer = participant[-1]
    
    
    if participant[-1] != completion[-1]: # 마지막 것이 다르면 정답
        answer = participant[-1]
        
    return answer


최종 풀이

def solution(participant, completion):
    participant.sort() # 정렬
    completion.sort() # 정렬
    
    for i in range(len(completion)):
        if participant[i] != completion[i]: # 다르면 정답
            return participant[i]
            # a b c d e VS a b d e 일 때 c가 정답이지만 d랑 e가 또 비교하기 전에 탈출해야 한다.
    
    # 앞에 것이 다 같으면 마지막 것이 달라 정답
    return participant[-1]

초기 풀이에서 3시간 동안 헤매다가 결국 구글링의 도움으로 ,, return 해버리면 되는 것을 계속 붙잡고 있었다.

  • for문에서 return 되지 않은 것은 participant[i] 가 completion[i]와 같다는 뜻(=앞에 것이 다 같다)
    그럼 가장 마지막 participant의 요소가 유일하게 다른 것이니 정답이 된다.
    바로 return, return 으로 깔끔하게 정리하면 된다.

간단하게 생각하면 되는 걸 모든 테케를 생각해가며 하려니까 오히려 더 복잡해지는 것 같다.

0개의 댓글