개발/알고리즘
[프로그래머스] 해시 - 완주하지 못한 선수
윤J
2024. 12. 10. 00:57
https://school.programmers.co.kr/learn/courses/30/lessons/42576
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해시 언제 사용하면 좋을까?
1. 리스트를 쓸 수 없을 때
리스트는 숫자 인덱스를 이용하여 원소에 접근하는데 즉 list[1]은 가능하지만 list['a']는 불가능함.
인덱스 값을 숫자가 아닌 다른 값 '문자열, 튜플'을 사용하려고 할 때 딕셔너리를 사용하면 좋음.
2. 빠른 접근 / 탐색이 필요할 때
딕셔너리 함수{} 의 시간복잡도는 대부분 O(1)이므로 아주 빠른 자료구조다.
3. 집계가 필요할 때
원소의 개수를 세는 문제는 코딩 테스트에서 많이 출제되는 문제입니다. 이때 해시와, collections 모듈의 Counter 클래스를 사용하면 아주 빠르게 문제를 풀 수 있음.
# 원래 코드, 정확도는 맞지만 효율성이 떨어짐
def solution(participant, completion):
for i in completion:
if i in participant:
participant.remove(i)
for j in participant:
return j
# Hash 적용
def solution(participant, completion):
hash_dict = {}
sumHash = 0
for i in participant:
hash_dict[hash(i)] = i # key: 원래값 해쉬 적용, value: 원래값
sumHash += hash(i)
for j in completion:
sumHash -= hash(j)
return hash_dict[sumHash]
# collections Counter 적용 (list -> dict로 바꿔줌)
from collections import Counter
def solution(participant, completion):
answer = ''
dict_result=Counter(participant)-Counter(completion)
return list(dict_result.keys())[0]