[프로그래머스] 전화번호 목록

1트


전원 통과 하지만 전부 시간초과

84.6 / 100

def solution(phone_book):   # 데이터 개수 100만
    answer = True
    cnt = 0
    for i in range(len(phone_book)):   # O(N)
        prefix = phone_book[i]
        for p in phone_book:           # O(N*N) = O(N^2) 
            if p.startswith(prefix):   # strncmp 와 유사
                print(p)
                cnt += 1
        if cnt > len(phone_book):
            answer = False
    return answer

그냥 startswith를 써서 그런것 같다.

해당 코드의 알고리즘은 O(N^2)으로 input이 100만이므로 1조의 연산을 하게 된다. 시간초과가 날 수 밖에..

2트


파이썬 sort연산의 특징을 이용하여 해결

문자열을 sort한다면 숫자의 “크기” 순서가 아니라 ascii기준 순서대로 정렬되므로 119, 11955, 1196 ← 이 순서로 정렬이 된다.

N은 100만이고, 해당 알고리즘은 시간복잡도가 sort에서 O(NlogN)

바깥 for문에서 O(N), 문자열의 최대 길이는 20이므로 startswith의 시간복잡도는 최대 20이다. 따라서 20*N정도인데 100만에 비하면 20은 작은 숫자이므로 그냥 O(N)으로 봐도 무방할듯 싶다.

따라서 정렬 알고리즘에 의해 성능이 좌우된다.

def solution(phone_book):   # 데이터 개수 100만
    answer = True
    phone_book.sort()
    for i in range(1, len(phone_book)):
        if phone_book[i].startswith(phone_book[i-1]):
            answer = False
            break
    return answer