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

Kun-Woo Kim·2025년 1월 14일

알고리즘 공부

목록 보기
18/24
post-thumbnail

문제 출처

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


문제

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

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.
  • 같은 전화번호가 중복해서 들어있지 않습니다.

내 답안

def solution(phone_book):
    # 전화번호부를 정렬 (사전순 정렬로 인접한 두 번호만 비교 가능)
    phone_book.sort()
    
    # 인접한 번호들만 비교
    for i in range(len(phone_book) - 1):
        # 현재 번호가 다음 번호의 접두어인지 확인
        if phone_book[i + 1].startswith(phone_book[i]):
            return False  # 접두어 관계가 존재할 경우 False 반환
    return True  # 모든 검사를 통과했을 때 True 반환

남의 풀이

def solution(phone_book):
    answer = True
    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:
                answer = False
    return answer

결론 및 느낀점

이번 문제는 전화번호부의 번호 중, 한 번호가 다른 번호의 접두어가 되는지 판별하는 문제였습니다.
원래 문제는 해시(HashMap) 카테고리였으나, 저는 정렬을 활용한 방식으로 접근했습니다.

내 풀이의 장점

  • 정렬 사용: 전화번호부를 사전순으로 정렬한 후, 인접한 번호만 비교하여 문제를 해결했습니다.
  • 시간 복잡도: O(n log n) (정렬) + O(n) (인접 비교) → 총 O(n log n)으로 제한사항을 만족시킵니다.
  • 코드의 간결함: 비교적 직관적이고 코드가 간단합니다.

남의 풀이 (해시 사용)의 장점

  • 해시맵 사용: 해시맵에 모든 번호를 저장하고, 각 번호의 접두어를 순회하며 해시 검색을 수행합니다.
  • 시간 복잡도: O(n * k) (n: 전화번호 수, k: 전화번호 길이)
    → 각 번호의 모든 접두어를 검사하기 때문입니다.
  • 공간 복잡도: 해시맵에 모든 번호를 저장하기 때문에 O(n)의 추가 공간이 필요합니다.

비교 및 느낀 점

  • 해시맵을 사용하는 방식이 직관적이고 접두어 탐색을 제대로 활용한 느낌이 들었습니다.
  • 그러나 제 방식인 정렬 후 인접 비교는 코드가 더 간결하고 시간 복잡도가 더 효율적이었습니다.
  • 앞으로는 문제의 카테고리를 잘 확인하고, 그에 맞는 자료구조를 활용하는 것이 중요하다고 느꼈습니다.
    특히 해시맵빠른 검색을 제공하는 강력한 도구이므로, 상황에 맞게 사용하는 것이 중요하겠습니다.
profile
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, Next.js 14, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.

0개의 댓글