알고리즘/해시

[프로그래머스] 전화번호 목록 - 파이썬(python)

아뵹젼 2022. 5. 5.

 

내 풀이

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 라는 엄청 유용한 함수를 사용하여 간단하게 풀었다.

파이썬에서 숫자 문자열을 sort() 하면, 숫자의 크기가 아닌 사전 형식으로 정렬이 된다.

즉, ["12", "123", "1235", "567", "88"] 과 같이 정렬된다.

-> 이는, 접두사를 비교할 때 인접한 인덱스 두 개만 비교를 하면 된다는 뜻이다.

 

 

다른 풀이 (1)

def solution(phoneBook):
    phoneBook = sorted(phoneBook)

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

zip 함수를 이용한 깔끔한 풀이이다.

zip 내장함수는 여러 Iterable 변수들을 병렬로 처리할 수 있다.

# zip 함수는 여러 인자들을 묶어서 병렬 처리를 할 수 있다.
for number, upper, lower in zip("12345","ABCDE","abcde"):
    print(number,upper,lower)

1 A a
2 B b
3 C c
4 D d
5 E e
# zip 형태로 묶은 데이터 차례대로 출력하기
for pair in zip(numbers, alphabet):
    print(pair)

('A',1)
('B',2)
('C',3)

 

 

다른 풀이 (2)

def solution(phone_book):
    
    hash = {}
    for i in phone_book :
        hash[i] = 1
        
    for phone_num in phone_book :
        temp = ""
        for num in phone_num :
            temp += num
            if temp in hash and temp != phone_num :
                return False
    
    return True

 

해시를 사용한 풀이이다.

사실 이번 문제에서는 zip 또는 startswith 를 사용하는게 더 직관적이긴 한데,

hash 문제니깐 hash 를 써서 풀어봐야지...

 

hash 로 phone_book 에 있는 번호들을 key 값으로, value 는 1로, 해시 테이블을 만든다.

그리고, 각 번호의 첫번째 글자부터 끝까지 늘려가면서, 접두사를 temp 에 만들어간다.

temp 가 해시 테이블에 있는 값이라면, 어떤 숫자가 해당 문자열의 접두사라는 뜻이므로 return False 를 하면 된다.

댓글