
https://school.programmers.co.kr/learn/courses/30/lessons/42577
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
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 # 접두어 관계가 존재할 경우 False 반환
return True # 모든 검사를 통과했을 때 True 반환
def solution(phone_book):
answer = True
hash_map = {}
# 해시맵에 모든 번호를 저장
for phone_number in phone_book:
hash_map[phone_number] = 1
# 각 번호의 접두어를 검사
for phone_number in phone_book:
temp = ""
for number in phone_number:
temp += number
# 현재까지의 접두어가 이미 해시맵에 존재하고, 자기 자신이 아닐 경우
if temp in hash_map and temp != phone_number:
answer = False
return answer
이번 문제는 전화번호부의 번호 중, 한 번호가 다른 번호의 접두어가 되는지 판별하는 문제였습니다.
원래 문제는 해시(HashMap) 카테고리였으나, 저는 정렬을 활용한 방식으로 접근했습니다.
O(n log n) (정렬) + O(n) (인접 비교) → 총 O(n log n)으로 제한사항을 만족시킵니다.O(n * k) (n: 전화번호 수, k: 전화번호 길이)O(n)의 추가 공간이 필요합니다.