λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[BOJ] νœ΄λŒ€ν° 자판(5070)

[λ°±μ€€(BOJ)] νœ΄λŒ€ν° 자판(5070) C++

문제 : BOJ_5070번 νœ΄λŒ€ν° 자판

문제 μ„€λͺ…

Trie(트라이)

트라이둜 ν•΄κ²°ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

μž…λ ₯ν•œ λ¬Έμžμ—΄ λ‹€μŒμ˜ λ¬Έμžκ°€ μ €μž₯된 λ¬Έμžμ—΄ 쀑 ν•˜λ‚˜λ°–μ— 없을 경우 μžλ™μœΌλ‘œ μž…λ ₯ν•΄ μ£Όκ³ ,

λ‹€μŒμ˜ λ¬Έμžμ—΄μ΄ ν•˜λ‚˜ μ΄μƒμ΄κ±°λ‚˜, μž…λ ₯을 멈좜 λ•ŒλŠ” μ‚¬μš©μžκ°€ μž…λ ₯을 ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ΄λ•Œ λͺ¨λ“  λ¬Έμžμ—μ„œ μ‚¬μš©μžκ°€ μž…λ ₯ν•΄μ•Ό ν•˜λŠ” μž…λ ₯의 평균 횟수λ₯Ό ꡬ해야 ν•©λ‹ˆλ‹€.


Solution

μš°μ„  κΈ°μ‘΄ 트라이의 곡식을 μ΄μš©ν•΄μ„œ 트라이 ꡬ쑰체 μ•ˆμ— λͺ¨λ“  λ¬Έμžμ—΄μ„ λ„£μ–΄μ€λ‹ˆλ‹€.

κ·Έ 뒀에 각 λ¬Έμžμ—΄λ§ˆλ‹€ ν•œ λ²ˆμ”© for문을 돌리며 μž…λ ₯ν•΄μ•Ό ν•˜λŠ” 횟수λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

μ €μž₯된 λ‹€μŒ λ¬Έμžκ°€ 2개 μ΄μƒμ΄κ±°λ‚˜, λλ‚˜λŠ” λ¬Έμžμ—΄μΌ 경우 횟수λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

μ΄λ•Œ, 문제의 μ‘°κ±΄μ—μ„œ μ²˜μŒμ—λŠ” λ°˜λ“œμ‹œ 1회 문자λ₯Ό μž…λ ₯ν•΄μ•Ό ν•˜λ―€λ‘œ, 항상 첫 λ¬Έμžμ—μ„œ νšŸμˆ˜κ°€ 1이 더해져야 ν•˜λŠ”λ°, λͺ¨λ“  λ¬Έμžμ—΄μ˜ 첫 κΈ€μžκ°€ 같을 μ‹œμ—λŠ” 1이 더해지지 μ•ŠμœΌλ―€λ‘œ, κ·Έ 경우만 λ”°λ‘œ 횟수λ₯Ό 1μ”© 더해주면 λ©λ‹ˆλ‹€.


Description

  1. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ μˆ˜κ°€ μ§€μ •λ˜μ§€ μ•ŠμŒμœΌλ‘œ EOFλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. (while (scanf("%d",&N) != EOF))
  2. char word[100001][81]λŠ” ν• λ‹Ή 크기가 ν¬λ―€λ‘œ μ§€μ—­λ³€μˆ˜κ°€ μ•„λ‹Œ μ „μ—­λ³€μˆ˜λ‘œ μ„ μ–Έν•©λ‹ˆλ‹€.
  3. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μŒ“μΌ 수 μžˆμœΌλ―€λ‘œ, Trieλ₯Ό μ‚­μ œν•΄ μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.(delete trie)
  4. λͺ¨λ“  λ¬Έμžμ—΄μ˜ 첫 λ¬Έμžκ°€ 같은 κ²½μš°μ—” 전체 κ°œμˆ˜μ—μ„œ N을 λ”ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

#include <iostream>
using namespace std;
struct Trie {
    Trie* childTrie[26];
    bool isWord;
    int childCnt;
    Trie() {
        for (int i = 0; i < 26; i++) childTrie[i] = nullptr;
        isWord = false;
        childCnt = 0;
    }
    ~Trie() {
        for (int i = 0; i < 26; i++) {
            if (childTrie[i]) delete childTrie[i];
        }
    }
    void insert(char* word) {
        if (*word == '\0') {
            isWord = true;
            return;
        }
        int nextNum = *word - 'a';
        if (childTrie[nextNum] == NULL) {
            childTrie[nextNum] = new Trie();
            childCnt++;
        }
        childTrie[nextNum]->insert(word + 1);
    }
    int check(char* word, int cnt) {
        if (*word == '\0') return cnt;
        if (childCnt > 1 || isWord) cnt++;
        int nextNum = *word - 'a';
        return childTrie[nextNum]->check(word + 1, cnt);
    }
};
int N;
char word[100001][81];
// μ „μ—­λ³€μˆ˜λ‘œ μ„ μ–Έ (μ‚¬μ΄μ¦ˆκ°€ ν¬λ―€λ‘œ)
int main(void) {
    while (scanf("%d",&N) != EOF) {
        // EOF μ‚¬μš©
        Trie* trie = new Trie();
        for (int i = 0; i < N; i++) {
            scanf("%s", word[i]);
            trie->insert(word[i]);
        }
        int result = 0;
        if (trie->childCnt == 1) result += N;
        // 전체 λ¬Έμžμ—΄μ˜ 첫 κΈ€μžκ°€ 같은 경우 N 더해주기
        for (int i = 0; i < N; i++) {
            result += trie->check(word[i],0);
        }
        printf("%.2f\n", (double)result / N);
        delete trie;
        // μ‚­μ œ
    }
    return 0;
}

'Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] μš©λŸ‰ λΆ€μ‘±(5446)  (0) 2022.03.08
[BOJ] 보석 μƒμž(2792)  (0) 2022.03.07
[BOJ] μ „ν™”λ²ˆν˜Έ λͺ©λ‘(5052)  (0) 2022.03.07
[BOJ] νžˆμŠ€ν† κ·Έλž¨(1725)  (0) 2022.03.07
[BOJ] κ³±μ…ˆ(1629)  (0) 2022.03.06