코딩테스트 연습 : 해시 level 2 전화번호 목록
문제 설명
앞의 전화번호가 뒤의 전화번호의 접두어가 되면 안된다. (x) -> 어떤 전화번호도 다른 전화번호의 접두어가 되면 안된다.
시도 1 : 딕셔너리를 2개 사용하여 앞, 뒤 요소를 비교
["119", "97674223", "1195524421"] 예제를 사용해서 설명하자면,
앞의 요소 119를 뒤에서부터 차례로 하나씩 늘려가며 hash1 에 값을 저장하고, 뒤의 요소 "97674223"를 앞의 요소 길이만큼 앞에서부터 차례로 하나씩 늘려가며 hash2에 값을 저장한다.
def solution(phone_book):
answer = True
for i in range(len(phone_book)-1):
hash1 = {}
hash2 = {}
for j in range(len(phone_book[i])):
hash1[phone_book[i][j:]] = 0
hash2[phone_book[i+1][:j+1]] = 0
# print(hash1)
# print(hash2)
# print("-------------------")
for key1 in list(hash1.keys()):
if key1 in hash2:
answer = False
return answer
하지만 이렇게 하게되면
수행 결과 화면과 같이 몇몇개가 실패가 드고
hash 딕셔너리 낭비도 되고 value 값을 둔 의미가 사라져서 수정하였다.
시도 2: 딕셔너리를 1개 사용하여 앞, 뒤 요소를 비교
def solution(phone_book):
answer = True
for i in range(len(phone_book)-1):
hash1 = {}
for j in range(len(phone_book[i])):
hash1[phone_book[i][j:]] = 0
compare = phone_book[i+1][0:len(phone_book[i])-j]
if compare in hash1:
answer = False
break
if not answer:
break
return answer
시도1과 비슷한 방법으로 hash2 딕셔너리를 사용하는 대신, 뒷 요소를 바로 비교할 수 있겠끔하였으나,
시도1과 똑같은 결과화면이 나왔다.
문제를 잘 못 이해하였다. 핸드폰 번호 리스트의 순서 상관 없이 어떤 전화번호의 접두사가 되는 순간 false가 된다.
시도 3: 리스트 사용하기
다른 사람의 풀이를 참고하였다.
def solution(phone_book):
for i in range(len(phone_book)):
k1 = len(phone_book[i])
for j in range(i+1, len(phone_book)):
k2 = len(phone_book[j])
if phone_book[i] in phone_book[j][:k1] or phone_book[j] in phone_book[i][:k2] :
return False
return True
한 전화번호의 길이만큼 다른 전화번호의 값과 비교하여 동일하면 false를 리턴하도록 하였다.
참고 블로그 : ychae-leah.tistory.com/47
[algorithm] level-2 전화번호 목록 (python)
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조��
ychae-leah.tistory.com
'study > 파이썬' 카테고리의 다른 글
[python] 프로그래머스 - 해시 level 1 (딕셔너리 개념 정리) (0) | 2020.06.11 |
---|---|
[python] 출력하기, print 옵션, 특수문자 (0) | 2020.03.19 |
[python] 입력값 받기, 한 번에 여러 입력값 받기 (0) | 2020.03.09 |
[python] 파이썬이란? (0) | 2020.03.09 |