본문 바로가기

알고리즘 삽질장

[프로그래머스] 전화번호 목록

반응형


문제설명

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

사고과정

  • 해쉬를 사용해야 하는 풀이라는데 해결하지 못했다.. 접두어를 어떻게 활용해야할지 고민하다가 결국 포기.. 예전에 풀었던 풀이로는 테스트 케이스가 추가되지 않아서 통과되지 않았다(startswith 문법 사용한 풀이)
  • 그래서 해쉬를 활용한 정석으로 풀어보자 했는데 풀이법을 떠올리기 쉽지 않았다.. 그래서 다른 분의 풀이 중에 해쉬를 활용한 정석 풀이가 있어서 참고했다.
  • 우선 처음에 전화번호를 해쉬에 모두 담는 1차 loop를 돈다.
  • 그리고 전화번호 loop를 돌면서 전화번호 숫자 loop를 도는 이중루프를 돈다. 이중루프를 돌 때, temp라는 빈문자열 변수에 전화번호 숫자 하나씩 추가하면서 그 때마다 완성되는 temp 문자열이 해쉬의 key에 이미 있으면서 그 temp가 탐색하고 있는 완성된 전화번호와 같지 않을 때! 접두어를 의미하므로 False를 반환한다. 이 때, 그 temp가 탐색하고 있는 완성된 전화번호와 같지 않을 때! 라는 조건이 처음엔 이해가 안갔는데 출력해서 결과물을 확인해보니까 이해가 갔다. 만약 이 조건을 빼먹으면 예를 들어, [119, 3321] 이렇게 있을 때, 119가 하나인데 119은 119의 접두어이다 같은 오답을 내게 된다.. 해당 조건문이 인상깊다..

풀이(스스로 못 푼 풀이)

def solution(phone_book):
    hash_map = {}
    for phone_number in phone_book:
        hash_map[phone_number] = 1
    for phone_number in phone_book:
        temp = ''
        for number in phone_number:
            temp += number
            if temp in hash_map and temp != phone_number:
                return False
    return True
반응형