알고리즘/프로그래머스문제풀이

[Python/프로그래머스]전화번호 목록_해시

개발자 덕구🐾 2022. 6. 14. 21:32
728x90

 

 

 

 

 

 

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

 

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

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

programmers.co.kr

 

 

 

 

 


 

 

 

 

 

내가 만든 코드 :  [효율성 테스트에서 실패]

 

def solution(phone_book):
    phone_book.sort()
    while phone_book :
        tmp = phone_book.pop(0)
        for i in phone_book :
            if i.startswith(tmp): 
                return False
    return True

 

이 코드를 만들고 돌렸을 때 startswith가 실행되진않아 꽤 오래 찾아봤다.

startswith에 딱히 다른 조건은 없고 print 하여 비교하여도 차이는 찾을 수 없었다. 

 

알고리즘 카톡방에 질문해서 그 답을 찾을 수 있었다. 

 

tmp.startswith(i)로 했던 것이다. 

비교하는 순서도 생각을 했어야 했는데 하지 않아 시작한는 단어임을 알수없었던것이다. 

 

그래서 정확성 테스트는 통과했으나 효율성에서 3,4가 실패를 받았다. 

 

 

 

 

정답 코드 : 

 

def solution(phone_book):
    phone_book.sort()
    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1):
            return False
    return True

 

 

 

배운 점 

 

1. zip 함수를 인수를 (phone_book)리스트로 주어서  for문을 돌릴 수 있다. 

 

2. sort를 해서 바로 다음 숫자와만 비교하면 된다. <한번만 비교하면 된다.>

[ 문자열을 sort하면 맨 앞자리 문자순으로 (오름차순) 정렬됩니다.]

 

Phone         = 119, 11952, 97674

Phone [1:0] = 11952, 97674

을 zip 하여 비교하므로  자신과 자신의 뒤 숫자가 비교되는 것이다. 

 

 

 

3. 당연하게도 startswith 에 순서를 생각하자. 

 

 

 

 

 


 

 

참고 블로그 : 

https://chan123.tistory.com/221

 

 

 

 

 

 

 복습 : 

 

20220618

✅ 20220621

✅ 20220623

  20220626

✅ 20220630

반응형