๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/BOJ

[BOJ] ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก(5052)

[๋ฐฑ์ค€(BOJ)] ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก(5052) Java

๋ฌธ์ œ : BOJ_5052๋ฒˆ ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

๋ฌธ์ œ ์„ค๋ช…

Trie(ํŠธ๋ผ์ด)

ํŠธ๋ผ์ด ๋ฌธ์ œ ์ค‘ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ „ํ™”๋ฒˆํ˜ธ๋“ค์„ ์ž…๋ ฅ๋ฐ›๋Š”๋ฐ, ํ•ด๋‹น ๋ฒˆํ˜ธ์˜ ์ฒซ ๋ฒˆํ˜ธ๋ถ€ํ„ฐ ๋ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ์ „ํ™”๋ฒˆํ˜ธ์˜ ์ฒซ ๋ฒˆํ˜ธ๋ถ€ํ„ฐ ํ•ด๋‹น๋˜์žˆ์œผ๋ฉด

์ผ๊ด€์„ฑ์ด ์—†๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ•ด์•ผํ•˜๊ณ , ์„œ๋กœ ๊ฒน์น˜์ง€์•Š์œผ๋ฉด ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


Solution

java๋กœ ํŠธ๋ผ์ด๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

String์„ ์ž…๋ ฅ๋ฐ›์€ ๋’ค, String์„ ํ•œ ๊ธ€์ž์”ฉ for๋ฌธ์œผ๋กœ ๋Œ๋ ค๊ฐ€๋ฉฐ,

ํ•ด๋‹น ์ž์‹ ๋ฒˆํ˜ธ๊ฐ€ ์—†์œผ๋ฉด Trie ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์ž์‹์˜ ์œ ๋ฌด์™€ ๋‹จ์–ด์˜ ๋ ์œ ๋ฌด๋ฅผ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค.


Description

ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ํŠธ๋ผ์ด ๊ทธ๋ž˜ํ”„์˜ ์ผ๊ด€์„ฑ์€ ์ •์  ๋ณ€์ˆ˜๋กœ ์ฒดํฌํ–ˆ์Šต๋‹ˆ๋‹ค.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java_5052_์ „ํ™”๋ฒˆํ˜ธ๋ชฉ๋ก {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for(int i=0;i<T;i++) {
            int n = Integer.parseInt(br.readLine());
            Trie trie = new Trie();
            for(int j=0;j<n;j++) {
                String word = br.readLine();
                trie.insert(word);
            }
            if(Trie.isConsistency) System.out.println("YES");
            else System.out.println("NO");
            Trie.isConsistency=true;
        }
    }

}

class Trie {
    static boolean isConsistency=true;
    // ์ •์  ๋ณ€์ˆ˜
    boolean isWord = false;
    boolean existChild = false;
    // ๋””ํดํŠธ ์†์„ฑ
    Trie[] childTrie = new Trie[10];
    void insert(String word) {
        int len = word.length();
        Trie nowTrie = this;
        for(int i=0;i<len;i++) {
            int nextNum = word.charAt(i)-'0';
            if(nowTrie.childTrie[nextNum]==null) nowTrie.childTrie[nextNum] = new Trie();
            nowTrie = nowTrie.childTrie[nextNum];
            // ์ž์‹ ๊ทธ๋ž˜ํ”„๋กœ ์ด๋™
            if(i==len-1) nowTrie.isWord=true;
            else nowTrie.existChild=true;
            if(nowTrie.isWord && nowTrie.existChild) isConsistency = false;
        }
    }
}

cpp๋กœ ์ง  ์ฝ”๋“œ๋„ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

#include <iostream>
#include <cstring>
using namespace std;
bool isConsistent = true;
struct Trie {
    bool isWord;
    bool existChild;
    Trie* childTrie[10];
    Trie() {
        isWord = false;
        existChild = false;
        for (int i = 0; i < 10; i++) childTrie[i] = nullptr;
    }
    ~Trie() {
        for (int i = 0; i < 10; i++) {
            if (childTrie[i]) delete childTrie[i];
        }
    }

    void insert(char* word) {
        if (*word == '\0') isWord = true;
        else {
            int next = *word - '0';
            if (!childTrie[next]) childTrie[next] = new Trie;
            existChild = true;
            childTrie[next]->insert(word + 1);
        }
        if (isWord && existChild) isConsistent = false;
    }
};
int main(void) {
    int T;
    cin >> T;
    for (int i = 0; i < T; i++) {
        isConsistent = true;
        Trie* trie = new Trie;
        int N;
        cin >> N;
        for (int j = 0; j < N; j++) {
            char word[11];
            cin >> word;
            trie->insert(word);
        }
        if (isConsistent) cout << "YES\n";
        else cout << "NO\n";
        delete trie;
    }
}

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] ๋ณด์„ ์ƒ์ž(2792)  (0) 2022.03.07
[BOJ] ํœด๋Œ€ํฐ ์žํŒ(5070)  (0) 2022.03.07
[BOJ] ํžˆ์Šคํ† ๊ทธ๋žจ(1725)  (0) 2022.03.07
[BOJ] ๊ณฑ์…ˆ(1629)  (0) 2022.03.06
[BOJ] ํšŒ์˜์‹ค๋ฐฐ์ •(1931)  (0) 2022.03.06