알고리즘/Problem Solving

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

도툐리 2024. 2. 17. 17:07

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[풀이1] string sort 이용

def solution(phone_book):
    
    # (1) 리스트 요소를 정렬 (string이니 a,b,c... 1,2,3... 순)
    phone_book.sort() # O(N Log N)
    
    # (2) 원소들 서로 앞뒤로 비교
    for i in range(len(phone_book)-1): # O(n)
        front = phone_book[i]
        back = phone_book[i+1]
        if (front==back[:len(front)]):
            return False        
    return True
  • string 리스트를 정렬했을때 어떻게 되는지를 생각할수만 있으면 이거 쉽게 풀리겠다 싶었음.
  • O(n) + O(N Log N) = O(N Log N)

 

[풀이2] 해시 - set 이용

def solution(phone_book):
    # (1) set에 key값 세팅
    my_set = set(phone_book)

    # (2) prefix substring 여부 확인    
    for phone_num in phone_book:
        sub_str = ""
        for i in range(len(phone_num)):
            sub_str += phone_num[i]
            if (sub_str in my_set and sub_str!=phone_num):
                return False
    
    return True
  • 프로그래머스 다른 사람 풀이 보니까 dict 썼던데 어짜피 dict의 value 부분은 필요없으니 set을 쓰는게 더 낫겠다 싶었음
  • 시간복잡도 O(n) * O(k) ....? 인거같은데 맞나..