본문 바로가기
Daily Coding Test/Python

[230228] 프로그래머스 Python Level 2. 전화번호 목록

by dev_swcyu 2023. 2. 28.

문제 설명 / 제한 사항 / 입출력 예제 / 입출력 예 설명

더보기
  • 전화번호 목록
문제 설명

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

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

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

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

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

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

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


알림

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

 

다른 사람 풀이 (1) : 슬라이싱 사용

def solution(ph):
    if len(ph) == 1:
        return True
    ph.sort(key=lambda x : x)
    for i in range(len(ph)-1):
        if ph[i] in ph[i+1][:len(ph[i])]:
            return False
    return True

 

다른 사람 풀이 (2) : zip(), startswith() 사용

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

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True
  • zip(iterables, strict=False) (https://docs.python.org/3/library/functions.html?highlight=zip#zip)
    • 여러 개의 각 iterable에서 하나의 item을 가져와 튜플을 생성한다
    • 길이가 다른 iterable들이 주어질 경우, 짧은 iterable이 소진되면 튜플 생성을 멈춘다.
    • strict 옵션
      • 기본 False
        • iterable들의 길이가 다를 경우 짧은 iterable을 기준으로 튜플 생성 후 중단
      • True
        • iterable의 길이가 같아야 하는 경우 사용
        • iterable의 길이가 다른 경우 ValueError 일으킨다
  • itertools.zip_longest(*iterables, fillvalue=None) (https://docs.python.org/3/library/itertools.html#itertools.zip_longest)
    • 길이가 짧은 iterable은 길이가 긴 iterable과 동일한 길이가 되도록 같은 값의 요소 (fillvalue)를 추가로 덧댈 수 있다
    • 길이가 긴 iterable이 잠재적으로 무한한 경우, islice()나 takewhile()과 같이 call의 횟수를 제한하여야 한다.
  • startswith(prefix[, start [, end]])
    • prefix로 시작하는 경우 True를, 아닌 경우 False를 반환한다.
    • prefix는 prefix의 tuple일 수도 있다
    • end를 옵션으로 명시할 경우, 해당 위치에서 비교를 멈춘다

 

다른 사람 풀이 (3) : 해시 사용

def solution(phone_book):
    answer = True
    hash_map = {}
    for phone_number in phone_book:
        hash_map[phone_number] = 1
    for phone_number in phone_book:
        temp = ""
        for number in phone_number:
            temp += number
            if temp in hash_map and temp != phone_number:
                answer = False
    return answer