[PS] 전화번호 목록

szlee·2024년 11월 5일
0

알고리즘 PS

목록 보기
20/24

전화번호 목록

데이터가 1,000,000개까지 가니까 최대 시간복잡도를 O(nlogn)까지 끊어야한다. => 파이썬의 정렬 사용 가능.

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 반환

정렬해서 인접한 것끼리만 비교하면 된다.

내가 푼 풀이 => deque, stack 이용

from collections import deque

def solution(phone_book):
    
    phone_book = deque(sorted(phone_book, key=lambda x : (x, len(x))))
    
    stack = []
    while phone_book:
        x = phone_book.popleft()
        if stack and x.startswith(stack[-1]) :
            return False
        stack.append(x)
        
    return True

시간 복잡도를 줄이려고 정렬해서 덱과 스택을 사용했다. 근데 위 풀이가 더 간단하다.


문제에서 의도한 해시맵 풀이

def solution(phone_book):
    # 해시맵(딕셔너리) 초기화
    phone_map = {}
    
    # 각 전화번호를 해시맵에 저장
    for phone_number in phone_book:
        phone_map[phone_number] = True
    
    # 각 전화번호에 대해 접두어가 해시맵에 존재하는지 확인
    for phone_number in phone_book:
        prefix = ""
        for digit in phone_number[:-1]:  # 마지막까지 가지 않고 접두어만 확인
            prefix += digit
            if prefix in phone_map:  # 접두어가 해시맵에 존재하면
                return False  # 다른 전화번호의 접두어가 된 것이므로 False 반환
                
    return True  # 접두어가 없는 경우 True 반환
profile
🌱

0개의 댓글