내 풀이
def solution(phone_book):
phone_book.sort()
for i in range(len(phone_book) - 1) :
if phone_book[i+1].startswith(phone_book[i]) :
return False
return True
해싱을 사용하지 않고, startswith 라는 엄청 유용한 함수를 사용하여 간단하게 풀었다.
파이썬에서 숫자 문자열을 sort() 하면, 숫자의 크기가 아닌 사전 형식으로 정렬이 된다.
즉, ["12", "123", "1235", "567", "88"] 과 같이 정렬된다.
-> 이는, 접두사를 비교할 때 인접한 인덱스 두 개만 비교를 하면 된다는 뜻이다.
다른 풀이 (1)
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
zip 함수를 이용한 깔끔한 풀이이다.
zip 내장함수는 여러 Iterable 변수들을 병렬로 처리할 수 있다.
# zip 함수는 여러 인자들을 묶어서 병렬 처리를 할 수 있다.
for number, upper, lower in zip("12345","ABCDE","abcde"):
print(number,upper,lower)
1 A a
2 B b
3 C c
4 D d
5 E e
# zip 형태로 묶은 데이터 차례대로 출력하기
for pair in zip(numbers, alphabet):
print(pair)
('A',1)
('B',2)
('C',3)
다른 풀이 (2)
def solution(phone_book):
hash = {}
for i in phone_book :
hash[i] = 1
for phone_num in phone_book :
temp = ""
for num in phone_num :
temp += num
if temp in hash and temp != phone_num :
return False
return True
해시를 사용한 풀이이다.
사실 이번 문제에서는 zip 또는 startswith 를 사용하는게 더 직관적이긴 한데,
hash 문제니깐 hash 를 써서 풀어봐야지...
hash 로 phone_book 에 있는 번호들을 key 값으로, value 는 1로, 해시 테이블을 만든다.
그리고, 각 번호의 첫번째 글자부터 끝까지 늘려가면서, 접두사를 temp 에 만들어간다.
temp 가 해시 테이블에 있는 값이라면, 어떤 숫자가 해당 문자열의 접두사라는 뜻이므로 return False 를 하면 된다.
'알고리즘 > 해시' 카테고리의 다른 글
[프로그래머스] 폰켓몬 - 파이썬(python) (0) | 2022.09.01 |
---|---|
[프로그래머스] 베스트앨범 - 파이썬(python) (0) | 2022.05.06 |
[프로그래머스] 위장 - 파이썬(python) (0) | 2022.05.05 |
[프로그래머스] 완주하지 못한 선수 - 파이썬(python) (0) | 2022.05.05 |
댓글