프로그래머스 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명을 숫자 형태로 찾는 방법이였습니다.🐥🐥🐥
위 풀이를 통해 해시 라는 개념을 어떻게 활용해야하는지 자세히 알게 된 것 같습니다.
감사합니다.