Algorithm/프로그래머스

전화번호 목록

코딩쪼앙 2022. 4. 3. 21:16

문제

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

 

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

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

programmers.co.kr

첫 번째 해결방법

문제를 0번째 인덱스가 접두어 인 경우 False를 반환하는 것으로 잘 못 이해하고 푼 코드

먼저 key값을 0번째 인덱스로 정하고, 지워준다.

그 후 기본 결과를 True로 넣어준 후, 접두사와 숫자 단위가 같아지도록 숫자를 변환한 후 answer에 넣어주었다.

그 후 answer값과 0번째 인덱스의 값이 같다면 False를 넣고 다른 것들은 탐색하지 않아도 되므로 break를 사용하였다.

-> 문제를 잘 못 이해해 정확도에서 몇 문제 틀렸고, for문을 많이 사용하여 효율성에서도 통과하지 못했다.

def solution(phone_book):
    key = phone_book[0]
    del phone_book[0]
    result = True
    for i in phone_book:
        num = i
        total = len(i)
        minus = len(i) - len(key)
        calc = 1
        for j in range(minus):
            calc *= 10
        answer = int(i) // calc
        if int(answer) == int(key):
            result = False
            break
    return result

두 번 째 해결방법

문자열을 정렬해 준 후 (문자열의 정렬은 int정렬과 달리 정말 직관적으로 길이 상관 없이 각 자리수의 숫자를 비교해서 정렬한다. ) zip을 사용하여 앞 뒤 문자를 비교할 수 있게 하였다 zip함수를 사용함으로 인해 p1은 0번째 인덱스부터 len(phone_book) - 1 번째 인덱스, 그리고 p2는 1번 째 인덱스부터 마지막 인덱스까지의 값을 가져 이중 for문의 역할을 한다. 

그 후 startswitch를 사용하여 앞의 숫자를 접두어로 가지는지 판단하여 접두어로 가지면 False를 반환하고 끝까지 돌았는데 접두어가 없다면 True를 반환한다.

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

'Algorithm > 프로그래머스' 카테고리의 다른 글

프로그래머스 H-Index  (0) 2022.04.21
[python] 프로그래머스 "가장 큰 수"  (0) 2022.04.21
프로그래머스 k번째 수  (0) 2022.04.21
위장  (0) 2022.04.05
완주하지 못한 선수  (0) 2022.04.03