Programmers/Level 2

C++ / 프로그래머스 / 전화번호 목록

GitHubSeob 2021. 11. 8. 21:17
문제

 

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

 

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

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

programmers.co.kr

문제풀이

 

한 번호가 다른 번호의 맨 앞에 있는 경우가 있는지를 확인하는 문제이다.

전화번호 목록을 크기 순으로 정렬하고, unordered_set을 이용하였다.

 

전화번호를 맨 앞부터 한 자리씩 str에 더한다.

전화번호가 저장된 unordered_set에서 str이 있는지 확인하고 있다면 바로 false를 return 한다.

끝까지 가도 없으면 현재 전화번호를 unordered_set에 저장한다.

 

코드
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;

bool cmp(string& s1, string& s2) {
    return s1.size() < s2.size();
}

bool solution(vector<string> phone_book) {
    sort(phone_book.begin(), phone_book.end(), cmp);
    unordered_set<string>num;
    string str("");
    for (int idx = 0; idx < phone_book.size(); ++idx) {
        str.clear();
        for (int idx2 = 0; idx2 < phone_book[idx].size(); ++idx2) {
            str += phone_book[idx][idx2];
            if (num.find(str) != num.end()) return false;            
        }
        num.insert(str);
    }

    return true;
}