본문 바로가기

두두의 알고리즘/문제

[해시] 프로그래머스 L2 '전화번호 목록' (Python)

728x90

<문제 링크>

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

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

programmers.co.kr


<문제 풀이>

  1. 한 번호가 다른 번호의 접두어인 경우를 확인하면 되므로 정렬시켜서 바로 앞, 뒤만 비교

<코드>

#1차시도 - 테스트 13 실패, 효율성 1,2,3,4 실패
def solution(phone_book):
    answer = True
    dic = dict()
    for idx,i in enumerate(sorted(phone_book)):
        dic[i] = idx
        
    for i in range(len(dic)):
        if i+1 == len(dic):
            break
        if list(dic.keys())[i] in list(dic.keys())[i+1]:
            answer = False
            
    return answer

 

#접두어만 검색하도록 고침
#False 다음 break

#2차시도 - 효율성 3,4 실패
def solution(phone_book):
    answer = True
    dic = dict()
    for idx,i in enumerate(sorted(phone_book)):
        dic[i] = idx
        
    for i in range(len(dic)):
        if i+1 == len(dic):
            break
        if list(dic.keys())[i] in list(dic.keys())[i+1][:len(list(dic.keys())[i])]:
            answer = False
            break
            
    return answer

 

#3차시도 - 해시 제거
def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(len(phone_book)):
        if i+1 == len(phone_book):
            break
        if phone_book[i] in phone_book[i+1][:len(phone_book[i])]:
            answer = False
            break
            
    return answer

 

<고쳐야 할 점>

  • A.startswith("B") → B가 A에 있으면 True. 기억하기