소소한 컴퓨터 이야기

전화번호 목록

by Cori

문제

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

 

· 구조대: 119 

· 박준영 : 97 674 223

· 지영석 : 11 9552 4421

 

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

 

· 제한사항

1. phone_book의 길이는 1이상 1,000,000이하입니다.

2. 각 전화번호의 길이는 1이상 20이하입니다.

3. 같은 전화번호가 중복해서 들어있지 않습니다. 

 

· 입출력 예

phone_book return
["119", "97674223", "1195524421"] false
["123", "456", "789"] true
["12", "123", "1235", "567", "88"] false

풀이

1. Me

1) 1차 시도

def solution(phone_book):
    phone_book.sort(key = lambda x: len(x))

    for i in range(len(phone_book)):
        val = phone_book[i] 
        for j in range(i+1, len(phone_book)):
            if val == phone_book[j][:len(val)]:
                return False  
    return True

입력받은 전화번호 목록 중 길이가 긴 전화번호는 해당 전화보다 길이가 짧은 전화번호의 접두어가 될 수 없기 때문에, 길이를 기준으로 전화번호 목록을 정렬하여 비교를 최소한으로 줄이고자 하였다. 이후, 전화번호 목록을 이중 탐색하며 접두어 여부를 판단하며 문제를 풀었으나 효율성 테스트 3, 4번에서 시간초과 발생, 실패하였다.

 

2) 2차 시도

def solution(phone_book):
    phone_book.sort()

    for i in range(1,len(phone_book)):
        val = phone_book[i-1] 
        if val == phone_book[i][:len(val)]:
                return False  
    return True

시간초과가 걸렸던 이유는, 전화번호 목록을 이중 탐색했기 때문인 것으로 보고, 전화번호 목록을 한번만 탐색하는 방법에 대해 생각해 보았다. 길이를 기준으로 정렬하는 것이 아닌, 값을 기준으로 정렬하면, '12', '123', 1235' 와 같은 형태로 정렬되기 때문에, 현재 값과 다음값만 비교하며 전화번호 목록을 한번만 훑으면 접두어 판단을 완료할 수 있다.

 

2. Others

def solution(phone_book):
    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:
                return False 
    return True

해쉬의 취지에 맞는 문제 풀이법이다.

def solution(phoneBook):
    phoneBook.sort()

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True

zip 함수와, sorted를 이용하여 문제를 풀었다. zip(phoneBook, phoneBook[1:]과 같이 사용하면 손쉽게 비교 가능

'CS > Coding Test' 카테고리의 다른 글

Hashing  (0) 2021.10.01
그룹 애너그램  (0) 2021.09.30
가장 흔한 단어  (0) 2021.09.29
로그 파일 재정렬  (0) 2021.09.28
타겟 넘버  (0) 2021.09.27

블로그의 정보

코딩하는 오리

Cori

활동하기