728x90
📌 풀이 1
우선 정렬을 하면 비교가 되겠다고 생각했다.
Participant와 Completion을 정렬하여 zip으로 묶어 for문으로 비교하여 만약 서로 다른 원소가 있다면 그 중 Participant에 있는 원소가 완주하지 못한 선수 이므로 해당 원소를 return해준다.
근데 여기서 한가지 조심해야 할 점이 있는데, Completion은 Participant보다 항상 길이가 1 적으므로 만약 완주하지 못한 선수가 정렬된 Participant의 가장 마지막에 있다면 for문이 돌아가지 않는 것이다.
나는 문제에 모든 참가자 이름은 소문자로 되어 있다는 조건을 보고 Completion의 마지막에
completion.append("A")
로 대문자를 추가해주는 (그 어떤 Participant와도 겹치지 않게) 급약처방으로 문제를 해결했다.
코드
def solution(participant, completion):
participant.sort()
completion.sort()
completion.append("A")
for a, b in zip(participant, completion):
if a != b:
return a
📌 풀이 2
문제 자체가 해시 탭에 있던 만큼 해시로 푸는 방법도 찾아 풀어보았다.
- HashMap이란 Key-Value의 Pair를 관리하는 클래스이다.
- 이 문제에서 Key는 hash한 값이 되겠고, Value는 각 선수의 이름으로 해둔다.
- 이 문제에서는 각 이름의 Hash 값을 구하고, 이 값들의 합을 구한다.
- 그렇게 합해진 sumHash에서 완주자들의 Hash를 빼게 되면 완주하지 못한 선수의 Hash 값만 남게 되므로 그 Hash의 Value를 찾아 return 해준다.
해시값을 구하는 방법은 파이썬 에서는 hash() 를 이용하면 된다.
participates = ["marina", "josipa", "nikola", "vinko", "filipa"]
for part in participates:
print(hash(part))
# 출력값
# -1541679985880489017
# -1326818124714316101
# -5566190426662992184
# 9198256884072924095
# -4314736286899648945
을 출력해보면 위와 같이 해싱함수로 계산된 해시값들이 출력되는 것을 확인할 수 있다.
코드
def solution(participant, completion):
temp = 0
dic = {}
for part in participant:
dic[hash(part)] = part
temp += hash(part)
for com in completion:
temp -= hash(com)
return dic[temp]
'Algorithm' 카테고리의 다른 글
[파이썬] 프로그래머스 - 전화번호 목록 (0) | 2022.04.02 |
---|---|
리트코드(LeetCode) 344번 문자열 뒤집기 (0) | 2022.03.28 |
[코틀린] 프로그래머스 64061(크레인 인형뽑기 게임) (0) | 2022.01.19 |
[파이썬] 프로그래머스 64061(크레인 인형뽑기 게임) (0) | 2022.01.19 |
[코틀린] 프로그래머스 42840(모의고사) (0) | 2022.01.19 |