문제: https://programmers.co.kr/learn/courses/30/lessons/42577?language=python3
문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제
phone_bookreturn["119", "97674223", "1195524421"] | false |
["123","456","789"] | true |
["12","123","1235","567","88"] | false |
입출력 예 설명
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
정답
def solution(phone_book):
# List to dictionary
dic = {i for i in phone_book}
# 전화번호 한개씩 꺼냄
for num in phone_book:
n = ""
# 한글자씩 추가해가며 dic에 있는지 확인
for i in num[:-1]:
n += i
# dic에 존재하면 False 반환
if n in dic:
return False
return True
풀이
def solution(phone_book):
book = {}
for i in phone_book:
book[i] = False
for key in book:
keys = list(book.keys())
keys.remove(key)
for i in keys:
if i.startswith(key):
return False
return True
한 번호가 다른 번호의 접두사인 경우를 구하는 문제입니다. 나를 제외한 다른 키들을 statwith()를 이용하여 내가 접두사인지 확인할 수 있어, 이를 이용한 코드입니다. 제출하면 정확성 테스트는 다 통과하나, 효율성 3, 4를 통과하지 못합니다.
방법을 찾아보니, phone_book에서 번호를 하나씩 꺼내서, 한 글자씩 추가해가면서 해시값으로 phone_book에 존재하는지 비교하는 것이 중요하다는 것을 알게 되었습니다. 그래서 전화번호를 해시값으로 비교하기 위해, 전화번호를 set의 형태로 저장한 뒤 비교했습니다.
def solution(phone_book):
# List to set
dic = {i for i in phone_book}
# 전화번호 한개씩 꺼냄
for num in phone_book:
n = ""
# 한글자씩 추가해가며 dic에 있는지 확인
for i in num[:-1]:
n += i
# dic에 존재하면 False 반환
if n in dic:
return False
return True
예를 들어 입력값이 ["119", "97674223", "1195524421"] 일 때, 기존 번호가 "97674223"의 접두사인지 확인하기 위해 "9", "97", "976", "9764", "9767", "97674", "976742", "9767422"가 set에 존재하는지 확인하는 것입니다.
추가로 "97674223"을 비교하지 않는 이유는 자기 자신은 set에 존재하기 때문에 생략했습니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 프린터 / Python (0) | 2021.08.01 |
---|---|
프로그래머스 - 위장 / Python (0) | 2021.08.01 |
프로그래머스 - 완주하지 못한 선수 / Python (0) | 2021.07.31 |
프로그래머스 - 입양 시각 구하기(2) / Oracle (0) | 2021.07.30 |
프로그래머스 - DATETIME에서 DATE로 형 변환 / Oracle (0) | 2021.07.30 |