둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (231) N
    • 프로그래머스 (3)
      • 해시 (1)
      • 다익스트라 (1)
      • 크루스칼 (1)
    • BOJ (180) N
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (32)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (14)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5)
      • 유니온 파인드 (1)
      • 분할 정복 (2)
      • 벨만-포드 (1)
      • 이분 탐색 (5) N
    • 자료구조 (15)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (2)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

프로그래머스/해시

전화번호 목록

2025. 9. 1. 19:02

전화번호 목록

사용 언어: C++

문제 요약

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.

전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

 

구조대 : 119

박준영 : 97 674 223

지영석 : 11 9552 4421

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

 

제한 사항

phone_book의 길이는 1 이상 1,000,000 이하입니다.

각 전화번호의 길이는 1 이상 20 이하입니다.

같은 전화번호가 중복해서 들어있지 않습니다.

입출력 예제

phone_book return

["119", "97674223", "1195524421"] false

["123","456","789"] true

["12","123","1235","567","88"] false

입출력 예 설명

입출력 예 #1

앞에서 설명한 예와 같습니다.

 

입출력 예 #2

한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

 

입출력 예 #3

첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

풀이

이 문제에는 Trie를 썼다. 물론 다른 풀이도 있다. 각 번호의 접두어를 확인하거나, 정렬을 이용해서 전화번호를 정렬 후, 인접한 두 문자열만 비교를 해도 된다. 하지만 연습삼아 Trie를 써본다.

  1. 각 전화번호를 문자 단위로 Trie에 삽입
  2. 삽입 중 다음 두 가지 조건을 확인
    • 기존 번호가 새 번호의 접두사 → 현재 노드의 isEnd = true
    • 새 번호가 기존 번호의 접두사 → 삽입 후 마지막 노드에 자식이 존재 (!children.empty())
  3. 위 조건 중 하나라도 성립하면 접두어 존재 → false
#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

bool answer = true;

struct TrieNode {
    unordered_map<char, TrieNode*> children;
    bool bIsEnd;

    TrieNode() : bIsEnd(false) {}
};

class Trie
{
private:
    TrieNode* root;
    
public:
    Trie() 
    {
        root = new TrieNode();
    }
    
    void insert(const string& word)
    {
        TrieNode* node = root;
        for(char c : word)
        {
            if(node->bIsEnd == true)
            {
                // 기존 단어가 새 단어의 접두사인 경우
                answer = false;
            }
            if(node->children.find(c) == node->children.end())
            {
                node->children[c] = new TrieNode();
            }
            node = node->children[c];
        }
        // 새 단어가 기존 단어의 접두사인 경우
        if(!node->children.empty())
        {
            answer = false;
        }
        
        node->bIsEnd = true;
    }
};

bool solution(vector<string> phone_book)
{
    Trie trie;
    
    for(string s : phone_book)
    {
        trie.insert(s);
    }
    
    return answer;
}
저작자표시 (새창열림)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바