파이썬에서 set 자료 구조는 해시 테이블을 기반으로 한다.
해시 테이블의 가장 큰 특징은 평균적인 상황에서 매우 빠른 데이터 검색(추가, 삭제, 조회 등) 속도를 제공한다는 점
= set은 요소의 존재 여부를 확인하는 것에 최적화되어 있기 때문에, 요소가 집합에 포함되어 있는지 여부를 매우 빠르게 확인
def solution(phone_book):
phone_hash = set(phone_book) # 해시 테이블 생성
for phone_number in phone_book:
prefix = ""
for number in phone_number[:-1]: # 마지막 문자는 제외하고 접두사를 생성합니다.
prefix += number
if prefix in phone_book:
return False
return True
- phone_book (list 자료구조)를 활용하여 prefix를 찾을 경우, 시간 초과
def solution(phone_book):
phone_hash = set(phone_book)
for phone_number in phone_book:
prefix = ""
for number in phone_number[:-1]:
prefix += number
if prefix in phone_hash: # 이 부분이 다름
return False
return True
- phone_hash (set 자료구조)를 활용하여 prefix를 찾을 경우 통과
2. 딕셔너리 관점에서 유용하게 사용하는 Counter 라이브러리
- 리스트 or 문자열이 주어질 때
from collections import Counter
participant = ["mislav", "stanko", "mislav", "ana"]
counter_part = Counter(participant)
print(counter_part)
>>> Counter({'mislav': 2, 'stanko': 1, 'ana': 1})
# Counter 객체는 일반 딕셔너리처럼 for문을 똑같이 돌리기 가능
for key, value in counter_part.items():
print(key, value)
>>> mislav 2
>>> stanko 1
>>> ana 1
# Counter 객체는 더하기, 뺄셈이 가능
# 뺄셈의 결과로 0이나 음수가 나온 요소는 결과값에서 제외된다.
counter1 = Counter(["A", "A", "B"])
counter2 = Counter(["A", "B", "B"])
counter1 + counter2
>>> Counter({'A': 3, 'B': 3})
counter1 - counter2
>>> Counter({'A': 1})
# 위 결과에서 A라는 키 값을 출력하는 방법
# => .keys() 메소드를 쓰면 dict_keys()라는 객체로 변환. 이거는 subscritable이 아니므로 list로 변환 후 인덱싱
print(list((counter1 - counter2).keys())[0])
# Counter 객체의 most_common 메소드
Counter('hello world').most_common()
>>> [('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
# most_common에 인자 K를 넣어주면 K만큼 제공
Counter('hello world').most_common(1)
>>> [('l', 3)]