Idealim

문제


My Solution

Idea. any, startswith 이용

def solution(phone_book):
    '''
    string 에서 subset 확인 
    '''
    for phone in phone_book:
        if any(other_phone.startswith(phone) for other_phone in phone_book if other_phone != phone):
            return False
        
    return True
  • 다른 전화부를 비교하는데 오버헤드 발생

Other’s Solution

Idea 1. 정렬을 이용한 풀이

⇒ 어떻게 비교 횟수를 줄일 수 있을까?
문자열 정렬을 이용시, 접두사 앞 뒤로 위치
즉, phoneBook[i] 와 phoneBook[i+1] 만 비교하면 된다.
ex. [“119”, “97674223”, “1195524421”,”118”] ⇒ [“118”, “119”, “1195524421”, “97674223”, ]

def solution(phoneBook):
    phoneBook.sort()

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True
  • sort, zip, startswith 이용
    • zip() 을 이용하여 phoneBook[i] 와 phoneBook[i+1] 쌍을 만든다.

Idea 2. Hash 를 이용한 풀이

def solution(phone_book):
    answer = True
    hash_map = set(phone_book)

    for phone_number in phone_book:
        temp = ""
        for number in phone_number:
            temp += number
            if temp in hash_map and temp != phone_number:
                return False
    return answer
  • Idea : “1195524421” ⇒ “1”, “11”, “119” … 의 값이 있는지 확인하자.
    • 이 아이디어가 유효한 이유 : phone_number 가 20 자리로 한정되어 있다.
    • in 키워드를 이용해 빠르게 O(1) 값이 있는지 확인이 가능하다.
반응형
profile

Idealim

@Idealim

읽어주셔서 감사합니다. 잘못된 내용이 있으면 언제든 댓글로 피드백 부탁드립니다.