## 의사코드 ##
# ! 접두어인 경우가 있을 때가 false / 없을 때는 true ! #
# 어떤 번호가 다른 번호의 접두어인지 확인 -> str.startswith()
# 현재 전화번호가 다른 전화번호의 접두어인지 확인하는 방법
# phone_book을 정렬 -> 전화번호의 맨 앞자리 수를 기준으로 순서대로 정렬됨
# for문
# if p[i+1].startswith(p[i]):
# answer = False
# else:
# answer = True
통과한 코드
def solution(phone_book):
answer = True
phone_book.sort() # 전화번호의 맨 앞자리 수를 기준으로 순서대로 정렬
for i in range(len(phone_book)-1):
if phone_book[i+1].startswith(phone_book[i]):
return False
return answer
-> sort()로 정렬 후, startswith()로 확인
startswith()
문자열이 특정 문자열로 시작하는지 확인
in
특정 문자열이 문자열에 포함되어 있는지 확인
# in과 startswith 비교
s = "12"
num = "531235"
# in -> True
print("'in':", s in num)
# startswith -> false
print("'startswith':", num.startswith(s))
# sort() -> 전화번호의 맨 앞자리 수를 기준으로 순서대로 정렬
phone_book = ["119", "97674223", "1195524421"]
phone_book.sort()
print(phone_book)
"""
['119', '1195524421', '97674223']
"""
-> 전화번호가 int가 아닌 str으로 되어 있어서 전화번호의 맨 앞자리 수를 기준으로 정렬됨
for문
for i in range(len(phone_book)-1) 하는 이유: IndexError를 피하기 위해
# ex)
phone_book = ["119", "97674223", "1195524421"]
for i in range(len(phone_book)-1):
print(i) # -> 0, 1
if phone_book[i+1].startswith(phone_book[i]):
# -> phone_book[1]과 phone_book[0]
# -> phone_book[2]과 phone_book[1]
다른 풀이
1. zip() 이용
def solution(phone_book):
phone_book = sorted(phone_book)
for p1, p2 in zip(phone_book, phone_book[1:]):
if p2.startswith(p1):
return False
return True
def solution(phone_book):
answer = True
# 해시 생성
hash_map = {}
# 해시에 전화번호 추가
for phone_number in phone_book:
hash_map[phone_number] = 1 # {전화번호: 1, 전화번호: 1, ...}
# -> key: phone_number / value: 1
# (value = 1 => 숫자가 1개 존재한다는 의미)
for phone_number in phone_book:
temp = ""
for number in phone_number:
temp += number
# temp가 해시에 존재하고, 전화번호와 같지 않은 경우 (=> 다른 번호의 접두어인 경우)
if temp in hash_map and temp != phone_number:
return False # answer = False라고 하는 것보다 바로 return False를 하는 게 시간이 더 빠름
return answer