본문 바로가기
Algorithm/프로그래머스(Programmers)

[ 파이썬(python) ] 프로그래머스 level2 - 전화번호 목록

by YWTechIT 2021. 3. 31.
728x90

📌 전화번호 목록

배열안에 한 번호가 다른 번호에 포함되어있으면 False를, 포함되어있지 않다면 True를 반환하는 문제다.


💡 나의 풀이

결론적으로 완벽한 해답을 찾지 못했다. 😅 😅

첫번째는 현재값과 다음값을 비교하는 방법이었다.
배열을 정렬(sort)하고 if array[i] in array[i+1]을 생각했는데 정확성에서 100% 답이 아니었다. 왜냐면 현재 번호가 포함되어있는 다음 번호에서도 자릿수가 다른 경우(['11', '1211)가 있을 수 있기 때문이다. 질문하기를 보니까 예전에는 통과한 코드인데, 21.3.4.부로 테스트 케이스가 변경되면서 더 이상 통과하지 않는 코드가 되었다.

두번째는 해쉬(hash)값을 이용하는 방법이었다.
for문으로 값을 하나하나씩 불러와서 0부터 hash값을 누적했을 때 다음 hash값과 동일하면 False, 아니면 True를 생각했다.
이때까지만 해도 hash('119')의 값과 hash('11') + hash('9')값은 동일하지 않을까?라고 생각했다. 왜냐면 문자열끼리 더하면 '11'+9' = '119'가 되니까... 지금 생각하면 엉뚱한 생각이지만, 문제 풀때까지만 해도

(와 나 천재?)

라는 생각을 잠깐 했었다.


다른 사람의 코드를 보고 잘 이해되는 코드가 2개 있었는데 다음과 같았다.

zip + startswith, hash값

zip함수부터 살펴보면 풀이 방법은 다음과 같다.

  1. array와 array[1:]를 선언한다.
  2. 두개의 배열을 정렬(sort)시킨다.
  3. zip으로 하나씩 비교하면서 array[1:] 현재값이 array 현재값으로 시작한다면 False, 아니면 True
# zip
def solution(phone_book):
    phone_book.sort()

    for prev, n in zip(phone_book, phone_book[1:]):
        if n.startswith(prev):
            return False
    return True

hash함수는 다음과 같다.
내가 풀려고 했던 두번째 방법과 비슷하지만, 조금 달랐는데 hash값을 더하는 대신 key값을 누적하면서 더했을 때 다른 값과 같은지 비교하는 방법이었다. 조금만 더 생각했으면 접근했을텐데 아쉬웠다.
그리고 이 코드의 마지막 if조건문을 이해하는데 시간이 필요했다.
배열안에 여러개의 값이 들어있을 때 값을 찾으려면 배열안의 배열 그 자체를 하나의 원소로 취급하는데 어떻게 현재 값 temp가 다른 원소 123과 같을 수 있단 말인가?

예를 들어 phone_book이 다음과 같을 때 현재 temp가 12면 값을 찾을 수 없는 상태가 아닌가?

phone_book = { '123': 1, '1235': 1, '567': 1, '88': 1}
current_value = '12'

print(current_value in phone_book)
👉🏽 False

그런데, 거꾸로 시야를 넓혀보면 금방 답을 찾을 수 있다.
예를 들어, 현재 number는 1235 이고 현재 temp123이라고 생각하면 이때는 temp in hash_dic이 성립한다.
앞 원소에만 집중한 나머지, 뒤의 index를 이용하여 temp를 만들 때 앞 index와 동일하다는것을 신경쓰지 못했다.

# dict
def solution(phone_book):
    hash_dic = {}

    for i in phone_book:
        hash_dic[i] = 1

    for number in hash_dic:
        temp = ''
        for j in number:
            temp += j

            # temp가 현재 비교하려는 number와 같지않지만 다른 index에 존재할 때
            if temp != number and temp in hash_dict: 
                return False
    return True
반응형

댓글