문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
문제의 분류는 해시였지만 정렬을 이용해 풀었습니다.
phone_book 리스트를 정렬한 후, 앞과 뒤를 비교해 뒤 문자열을 비교하는 방법으로 풀었습니다.
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(): 문자열이 지정된 접두사로 시작하는지 확인하는 파이썬 문자열 메서드
위 코드의 시간 복잡도는 O(nlogn) 입니다.
이 코드는 해시 테이블을 사용하는 해시 기반의 구현보다는 시간 복잡도가 크고, 메모리 사용량도 큽니다. 따라서 큰 입력에 대해서는 더 나은 성능을 발휘하지 못할 수 있습니다.
def solution(phone_book):
hash_map = {}
for phone_number in phone_book:
hash_map[phone_number] = 1
for phone_number in phone_book:
prefix = ""
for number in phone_number:
prefix += number
if prefix in hash_map and prefix != phone_number:
return False
return True
해시 기반의 이 구현 방법은 시간 복잡도가 O(N*K)입니다. for 루프가 두 번 중첩되어 있기 때문에, 최악의 경우에는 전체 전화번호부에서 모든 전화번호를 비교해야 하기 때문입니다.
그러나 해시 테이블을 사용하기 때문에 startswith() 메서드를 반복해서 호출하지 않아도 되므로, 앞서 소개한 startswith()를 사용하는 방법보다 더 빠릅니다.