전화번호 목록-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.2]

2022. 11. 3. 14:29·Algorithm, 코딩테스트
728x90
반응형

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42577?language=python3

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


풀이

def solution(phone_book):
    prefix_set= set() # 접두어들의 집합
    for i in phone_book:
        for j in range(1,len(i)):
            prefix_set.add(i[:j]) # 가능한 모든 접두어들을 추가해준다.
    for i in phone_book:
        if i in prefix_set: # 특정 전화번호와 다른 전화번호의 접두어가 같을 경우
            return False
    return True

Tip

  • 각 전화번호들마다 해당 전화번호가 다른 전화번호들의 접두사인지 확인하는 방법은 O(n^2)의 시간복잡도가 필요하다. 그런데 phone_book의 최대 크기가 1,000,000이므로 불가능하다. (시간 초과)
  • 따라서 반복문을 돌면서 각 전화번호의 접두사들을 집합(prefix_set)에 넣은 뒤, 다시 반복문을 돌면서 각 전화번호가 집합에 존재하는지 확인하면 O(n*20(=최대 전화번호 길이))의 시간복잡도로 풀 수 있다.

 

  • 추가로 아래와 같이 풀 수도 있다.
def solution(phoneBook):
    phoneBook = sorted(phoneBook)

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True
  • 이 방법은 정렬을 이용한 방법으로 시간복잡도는 O(nlog(n))이다.
  • 어떤 문자열 a가 문자열 b의 접두사이고 나머지 문자열들의 접두사가 아닐 경우, 정렬했을 때 a가 b 바로 앞에 있게 되므로, 그 점을 활용한 것이다.

TIL

  • str1.startswith(str2): str2가 str1으로 시작하는지 확인하여 맞을 경우 True, 아닐 경우 False를 반환한다. (str2가 str1의 접두사인지 확인)
  • zip(a,b)에서 a와 b의 길이가 다를 경우 더 짧은 쪽을 기준으로 길이가 결정된다.
a=[1,2,3]
b=[4,5]

for i,j in zip(a,b):
	print((i,j))
    
'''
결과:
(1,4)
(2,5)
'''
728x90
반응형
저작자표시 비영리 (새창열림)

'Algorithm, 코딩테스트' 카테고리의 다른 글

베스트앨범-파이썬(Python)[프로그래머스/코딩테스트 연습/Lv.3]  (0) 2022.11.03
의상-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.2]  (0) 2022.11.03
옹알이 (2)-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.1]  (0) 2022.11.01
햄버거 만들기-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.1]  (0) 2022.11.01
신고 결과 받기-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.1]  (0) 2022.10.31
'Algorithm, 코딩테스트' 카테고리의 다른 글
  • 베스트앨범-파이썬(Python)[프로그래머스/코딩테스트 연습/Lv.3]
  • 의상-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.2]
  • 옹알이 (2)-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.1]
  • 햄버거 만들기-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.1]
20mini
20mini
개발 공부를 하며 알게 된 내용들을 기록한 블로그입니다. 댓글로 조언, 지적, 충고 등 다양한 의견들 항상 환영합니다!!
    반응형
    250x250
  • 20mini
    해시태그코딩 #coding
    20mini
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • Python (1)
      • Algorithm, 코딩테스트 (82)
      • Machine Learning (8)
      • 논문 리뷰 (0)
      • 그 외 공부 관련 (2)
      • 기타 (1)
  • 인기 글

  • 태그

    완전탐색
    프로그래머스
    lv.1
    Machine Learning
    알고리즘
    hash
    Python
    lv.2
    lv.3
    코딩테스트
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
20mini
전화번호 목록-파이썬(Python) [프로그래머스/코딩테스트 연습/Lv.2]
상단으로

티스토리툴바