본문 바로가기
프로그래밍/알고리즘 문제

[프로그래머스] 해시 - 전화번호 목록 (python)

by 잇서니 2019. 8. 28.
반응형

1차시도! 성공인데 사실은 틀린 코드

def solution(phone_book):
    answer = True
    phone_book.sort()
    phone_book_dict=dict(zip(phone_book,range(len(phone_book))))
    
    for i in phone_book:
        phone_book_dict.pop(i)
        for j in phone_book_dict:
            if i in j:
                return False
        
    return answer

 

아이디어

  • 비교 횟수를 줄이기 위해 phone_book을 정렬합니다.
  • phone_book 리스트의 값을 key로 갖는 딕셔너리를 만듭니다.
  • phone_book 리스트의 각 요소가 (for i in phone_book) 다른 요소값(phone_book_dict.pop(i), for j in phone_book_dict)에 포함됐는지 확인합니다.

틀린 이유

  • 접두사인지 아닌지는 판단 못하고 포함됐는지만 확인됩니다. 예를 들어, ["12","312","111"] 인 경우는 True인데 위 코드에서는 False가 됩니다. 접두어가 아니지만 "12"가 "312"에 포함되긴 하니깐요. 
  • 근데 프로그래머스에서는 정답으로 처리되네요.

다른 분들의 코드

def solution(phoneBook):
    phoneBook = sorted(phoneBook)

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True

 

  • 신기하리만큼 많은 분들이 똑같은 코드를 짜셨더라구요!
  • zip(phoneBook, phoneBook[1:])로 요소 2개씩 비교합니다.
  • startswith() 함수로 접두어인지 확인합니다.

 

파이썬개념

1) 해당 값이 딕셔너리 key에 포함됐는지 확인

i in phone_book_dict
i in phone_book_dict.keys()
i in list(phone_book_dict.keys())

포함됐으면 True, 포함되지 않았으면 False를 반환합니다.

 

2) 딕셔너리도 pop을 할 수 있습니다. key를 기준으로 수행됩니다.

sunny_dict={"hi":22, "sunny":33}
print(sunny_dict)
# {"hi":22, "sunny":33}

sunny_dict.pop("hi")
print(sunny_dict)
# {"sunny":33}

 

3) 리스트 인덱스 슬라이싱

a=[1,3,2,5,4]
for p1, p2 in zip(a,a[1:]):
	print(p1, p2)
    
# 1	3
# 3	2
# 2	5
# 5	4

원소 2개씩 비교하고 싶을 때 사용하면 유용하겠네요.

 

4) startswith() 함수

p1="hi"
p2="hisunny"

if p2.startswith(p1):
	print("bye")
    
# bye

p2가 p1으로 시작되는지 확인합니다. True 혹은 False를 반환합니다.

반응형

댓글