관리 메뉴

TEAM EDA

[프로그래머스] 전화번호 목록 / 파이썬 본문

EDA Study/알고리즘

[프로그래머스] 전화번호 목록 / 파이썬

김현우 2020. 4. 6. 00:15

전화번호 목록

문제 설명

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

  • 구조대 : 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입니다.

풀이

  • sorted를 이용해서 앞자리가 같은 문자열을 정렬
  • (phone_book[start][0] == A[0])에서 앞자리가 같은 값들만 비교
    • 중간에 똑같은 값을 찾으면 탈출 (A == phone_book[start][0:len(A)])
def solution(phone_book):
    answer = True
    phone_book = sorted(phone_book)
    while len(phone_book) > 1: 
        start = 0
        A = phone_book.pop(0)
        while (phone_book[start][0] == A[0]) & (start < len(phone_book)):
            if A == phone_book[start][0:len(A)]:
                answer = False
                break
            start += 1
            if answer == False: break
    return answer

다른사람 풀이

  • 풀이는 똑같음

  • startswith는 괄호안의 값이 같은지 확인하는 함수

    • A.startswith(B, 0, 10) : A의 0부터 10이 B와 같은 지 확인
    • 아무값도 없으면 0부터 B의 길이까지 확인
  • 근데, 이 방법이 되는 이유가 sorted()에 의해서 됨

    • 위의 내 코드도 sorted때문에 앞자리 같은 값만 비교하지 않아도 되었음 !!!

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

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
	return True

출처: 프로그래머스 코딩 테스트 연습,https://programmers.co.kr/learn/challenges