프로그래머스 해시 전화번호 목록

hyewon9913·2023년 10월 19일
0

코딩테스트(python)

목록 보기
4/46

초반에 해시를 이용해 구현하는 방법이 감이 안잡혀 일단 리스트를 이용해 구현했다.

def solution(phone_book):
    answer = True
    dic = {i:number for  i,number in enumerate(phone_book)}
    print(list(dic.values()))

    for i in range(len(phone_book)):
        for j in range(len(phone_book)):
            if i != j:
                if phone_book[j].find(phone_book[i]) == 0:
                    return False

    return answer

물론 당연히 런타임에러가 발생함 ...

딕셔너리를 이용하여 아래와 같이 수정함

def solution(phone_book):
    answer = True
    dic = {number:i for  i, number in enumerate(phone_book)}
    
    # print(dic)
    for number in phone_book:  #각 번호 마다 확인
        str_num = ''
        for n in number: # 각 번호를 숫자 하나씩 붙여가며 접두사 존재여부 확인
            str_num += n
            if str_num in dic and str_num != number:
                return False

    return True

이때 str_num in dic 처럼 해당 문자열이 딕셔너리에 존재하는지 딕셔너리를 통해 조회해서 이전과는 달리 런타임에러가 발생하지 않는 것 같다.

[다만 딕셔너리에서 in을 할 때 문자열이면 딕셔너리 키값에 "abcdefg" 가 있고 "abc" in dic 을 해도 True 가 나오는지는 처음 알았다.] (사실이 아님 착각함)

처음에 위와 같은 원리로 되는 줄 알았는데 착각했다.

접두사가 되는 번호가 number일 때가 아니라 "123456789" 가 number일 때 str_num 이 "123" 이 되는 순간 False를 return하는 것이였다.

구현해놓고도 잘못 이해했다......

예를 들면

dic2 = {"abcdefg" : 1}
    print("dic2:","abc" in dic2)

dic2: False

오해하면 안되겠다.

profile
차근차근 굴러가는 코딩일지

0개의 댓글