본문 바로가기
프로그래머스/Lv.2

[프로그래머스 Lv.2][해시] 전화번호 목록 (python)

by 똥먹는낙타 2022. 10. 12.
728x90
반응형

문제 설명

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

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

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

제한 사항
  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제phone_bookreturn
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false
입출력 예 설명

입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.


알림

2021년 3월 4일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.

 

 Code (테스트케이스 13,14 실패 / 시간 초과)

def solution(phone_book):
    phone_book.sort()
    
    for i in range(0, len(phone_book)):
        for j in range(i+1, len(phone_book)):
            if phone_book[i] in phone_book[j]:
                return False
                
    return True

 

"119", "2119" 이런 식으로 오는 테스트케이스를 생각하지 못했다. 그냥 in 으로 풀면 안 될 것 같고 시간도 초과된다.

 

 Code (시간 초과)

def solution(phone_book):
    phone_book.sort()
    
    for i in range(0, len(phone_book)):
        for j in range(i+1, len(phone_book)):
            if phone_book[i] in phone_book[j] and phone_book[i][0] == phone_book[j][0]:
                return False
                
    return True

 

위에서 실패했던 테스트케이스들은 해결됐지만 여전히 효율성 테케 3, 4가 시간초과. 다른 방식을 생각해야했다...

 

✔️ Code

def solution(phone_book):
    phone_book.sort()
    
    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1): #p2가 p1으로 시작한다면
                return False              
    return True

 

결국 구글링해서 참고했다. 깨닫지 못하고 있던 사실이 있는데, 만약에 어떤 번호가 다른 번호의 접두어라면 정렬했을 때 이 둘은 앞뒤에 위치하게 된다. 예를 들어 phone_book이 ["123", "1234", "12"] 라면 이를 정렬하면 ["12", "123", "1234"]가 된다. 따라서 phone_book[i]와 phone_book[i+1]을 계속 비교해주면 되는데 zip 함수와 startswith 함수를 사용한 풀이를 참고해 이를 더 간단하게 작성해보았다. zip을 사용해서 굳이 이중 for문을 돌리지않고도 동시에 앞뒤 값을 비교할 수 있다.

728x90
반응형

댓글