[c++] BOJ 5052 :: ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

๋‚œ์ด๋„ : ๊ณจ๋“œ 4

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 20๋ถ„

 

๋ฌธ์ œ

์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, ์ด ๋ชฉ๋ก์ด ์ผ๊ด€์„ฑ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก์ด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด, ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ์˜ ์ ‘๋‘์–ด์ธ ๊ฒฝ์šฐ๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก์ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž

  • ๊ธด๊ธ‰์ „ํ™”: 911
  • ์ƒ๊ทผ: 97 625 999
  • ์„ ์˜: 91 12 54 26

์ด ๊ฒฝ์šฐ์— ์„ ์˜์ด์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ์ „ํ™”๊ธฐ๋ฅผ ๋“ค๊ณ  ์„ ์˜์ด ๋ฒˆํ˜ธ์˜ ์ฒ˜์Œ ์„ธ ์ž๋ฆฌ๋ฅผ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ ๊ธด๊ธ‰์ „ํ™”๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ๋ชฉ๋ก์€ ์ผ๊ด€์„ฑ์ด ์—†๋Š” ๋ชฉ๋ก์ด๋‹ค.

 

ํ’€์ด

  • b+tree ์‚ฌ์šฉ

 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct Node {
    int num;
    bool isHere;
    Node* next[10] = { nullptr };
    Node(int n, bool b) {
        num = n;
        isHere = b;
    }
};

Node* head[10]; // ์‹œ์ž‘ ๋ฒˆํ˜ธ ๋…ธ๋“œ

bool pushTree(string str) {


    Node* previous = head[str[0] - '0'];
    for (int i = 1; i < str.size(); i++) {
        if (previous->isHere) {
            // ์ผ๊ด€์„ฑ o
            return false;
        }

        int number = str[i] - '0';
        Node* tmp;
        if (previous->next[number] == nullptr) {
            // ์—†๋‹ค๋ฉด ๋งŒ๋“ค๊ธฐ
            tmp = new Node(number, false);
            previous->next[number] = tmp;
        }
        else {
            // ์žˆ๋‹ค๋ฉด ๊ธฐ์กด ๊ฒƒ ๋“ฑ๋ก
            tmp = previous->next[number];
            if (i == str.size() - 1) {
                // ๊ธฐ์กด์— ์žˆ๋˜ ๋…ธ๋“œ์ธ๋ฐ, ๋งˆ์ง€๋ง‰์ด๋ฉด ์ข…๋ฃŒ => sort ์•ˆํ•˜๋Š” ๋Œ€์‹ 
                return false;
            }
        }
        previous = tmp;
    }
    previous->isHere = true;
    return true;
}

bool compare(string a, string b) {
    return a.size() < b.size();
}

int main() {
    // 11์‹œ 20๋ถ„ ์‹œ์ž‘
    // b+tree
    // ๋งŽ์•„๋„ 9๊ฐœ
    // ์ˆซ์ž, ์†ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋Š”์ง€, ๋‹ค์Œ ์ˆซ์ž ๋…ธ๋“œ ์ง‘ํ•ฉ => ๋ถ€๋ชจ ๋…ธ๋“œ์— ์ˆซ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ

    int t; cin >> t;
    while (t--) {
        int n; cin >> n;
        vector<string> phoneNumList;
        for (int i = 0; i < n; i++) {
            string tmp; cin >> tmp;
            phoneNumList.push_back(tmp);
        }

        // sort(phoneNumList.begin(), phoneNumList.end(), compare); //

        for (int i = 0; i < 10; i++) {
            head[i] = new Node(i, false);
        }

        bool flag = false;
        for (int i = 0; i < n; i++) {
            if (!pushTree(phoneNumList[i])) { // ์ผ๊ด€์„ฑ ์—†์Œ
                cout << "NO" << '\n';
                flag = true;
                break;
            }
        }
        if (!flag) {
            cout << "YES" << '\n';
        }
    }
}

 

๊ฐœ์„ 

  • unordered_map์œผ๋กœ ๋ฐ”๊พธ์–ด ๋ณด์•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ๋” ๋งŽ์ด ๊ฑธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋„ 2๋ฐฐ๊ฐ€ ๋จ
  • sort์˜ compareํ•จ์ˆ˜๋ฅผ ๊ธธ์ด๋งŒ์œผ๋กœ ๋ฐ”๊พธ๋‹ˆ ๊ณต๊ฐ„, ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ชจ๋‘ ์กฐ๊ธˆ ๊ฐœ์„ ๋จ
  • sort๋ฅผ ์—†์• ๊ณ  ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒƒ์„ ๋จผ์ €ํ•ด๋„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ๋”๋‹ˆ ์‹œ๊ฐ„๋ณต์žก๋„ ์•ฝ๊ฐ„ ๊ฐœ์„ ๋จ

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์–ธ์–ด
gmldms784 91592 184 C++17 / ์ˆ˜์ •
๋ฐ˜์‘ํ˜•