프로그래머스_완주하지 못한 선수

임정민·2023년 12월 10일
0

알고리즘 문제풀이

목록 보기
132/173
post-thumbnail

프로그래머스 Lv1 문제입니다. 실전에 대비하기 위해 30분 시간제한을 두고 풀었습니다.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42576#

[나의 풀이]

⌛ 20분


# from collections import Counter

def solution(participant, completion):
    answer = ''
    
    if not completion:
        return participant.pop()

    participant.sort()
    completion.sort()
    
    while participant:
        
        par = participant.pop()
        
        if completion:
            com = completion.pop()
        
        if par != com:
            break
    
    answer = par

    return answer

마라톤에 참가한 참여자 리스트 (pariticipant)와 완주자 리스트(completion)가 입력되고 완주하지 못한 자 1명을 구하는 문제입니다.🐦🐦🐦

최초 Counter를 활용하여 구현할까 고민했다가 각 리스트를 정렬한 후 하나씩 pop()하며 해결하는 방식이 구현하는데 직관적이라고 생각하여 위와 같이 해결하게 되었습니다.

[다른 사람의 풀이1]


import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

참여자, 완주자 리스트를 모두 Counter 객체로 만든 뒤 바로 뺄셈 연산한 방식입니다. Counter 객체의 key-value 값들을 연산할 수 있다는 것을 처음 알게 되었고 가장 짧은 풀이로 인상깊었습니다.🐬🐬🐬

[다른 사람의 풀이2]


def solution(participant, completion):
    answer = ''
    temp = 0
    dic = {}
    for part in participant:
        dic[hash(part)] = part
        temp += int(hash(part))

    for com in completion:
        temp -= hash(com)

    answer = dic[temp]

    return answer

해시 개념을 가장 잘 활용한 풀이입니다. 참여자 리스트의 각 참여자를 hash()함수로 바꾸어


dic = {-3606295771378259124: 'leo', -9133859907366660985: 'kiki', 3411877350090138020: 'eden'}

위와 같이 참여자의 고유 값들을 key, 참여자를 value로 하게끔 구성해주고 temp라는 변수에 모든 참여자들을 숫자로 연산하여 저장한 뒤

완주자 리스트들을 다시 탐색하며 hash()함수로 바꿔주어 숫자로 변환한 뒤 temp(모든 완주자 연산 값) 들에서 연산함으로써 완주하지 못한 1명을 숫자 형태로 찾는 방법이였습니다.🐥🐥🐥

위 풀이를 통해 해시 라는 개념을 어떻게 활용해야하는지 자세히 알게 된 것 같습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글