프로그래머스 : 전화번호 목록(python)

WoongSoo Kim·2021년 6월 20일

배운점 : sort()함수, startswith()함수

원 코드

def solution(phone_book):
    answer = True
    num = 0
    while num < len(phone_book):
        x = phone_book[num]
        phone_book.remove(x)
        num2 = 0
        while num2 < len(phone_book):
            if x in phone_book[num2]:
                answer = False
                break
            num2+=1
        phone_book.insert(num,x)
        num+=1
    return answer

결과 : 효율성 0점 정확도 : 11/13

처음으로 짠 코드이다. in을 사용했기 떄문에 접두어임을 알 수 없고, 이중 loop이기 때문에 효율성도 떨어진다.

모범답안

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

여기서 sort()라는 개념과, 이중 zip이라는 함수를 처음으로 접했다.
sort() : 말 그대로 정렬한다. 시간복잡도는 O(N logN)이다.
zip() : 여러 개의 리스트를 짝지어준다.
startswith() : in의 괄호 안에 들어간 것의 길이만큼, 즉 이 함수가 바로 접두어 체크하는 함수이다.

for num,upper,lower in zip('123','abc','ABC'): print(number, upper, lower)
같이 사용한다.(zip을 사용하지 않을 경우, num에 있는 값부터 순서대로 출력된다)

모범답안 참고 후 새로 짠 코드

def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(len(phone_book) - 1):
       if phone_book[i] in  phone_book[i+1][:len(phone_book[i])]:
           return False
    return True

정렬 후, 숫자이므로 뒤의 값이 앞의 값보다 클 것이므로(길이든 크기든) 앞의 리스트 값만큼 확인해보고 있으면 false를 리턴해주는 코드로 짰다. startswith함수도 나름 쓸만하지만, sort() 이거는 항상 기억해두고 있어야겠다.

profile
변하고자 할 때는

0개의 댓글