[λ°±μ€(BOJ)] ν΄λν° μν(5070) C++
λ¬Έμ : BOJ_5070λ² ν΄λν° μν
λ¬Έμ μ€λͺ
Trie(νΈλΌμ΄)
νΈλΌμ΄λ‘ ν΄κ²°νλ λ¬Έμ μ
λλ€.
μ
λ ₯ν λ¬Έμμ΄ λ€μμ λ¬Έμκ° μ μ₯λ λ¬Έμμ΄ μ€ νλλ°μ μμ κ²½μ° μλμΌλ‘ μ
λ ₯ν΄ μ£Όκ³ ,
λ€μμ λ¬Έμμ΄μ΄ νλ μ΄μμ΄κ±°λ, μ
λ ₯μ λ©μΆ λλ μ¬μ©μκ° μ
λ ₯μ ν΄μ£Όμ΄μΌ ν©λλ€.
μ΄λ λͺ¨λ λ¬Έμμμ μ¬μ©μκ° μ
λ ₯ν΄μΌ νλ μ
λ ₯μ νκ· νμλ₯Ό ꡬν΄μΌ ν©λλ€.
Solution
μ°μ κΈ°μ‘΄ νΈλΌμ΄μ 곡μμ μ΄μ©ν΄μ νΈλΌμ΄ ꡬ쑰체 μμ λͺ¨λ λ¬Έμμ΄μ λ£μ΄μ€λλ€.
κ·Έ λ€μ κ° λ¬Έμμ΄λ§λ€ ν λ²μ© forλ¬Έμ λ리며 μ
λ ₯ν΄μΌ νλ νμλ₯Ό μ μ₯ν©λλ€.
μ μ₯λ λ€μ λ¬Έμκ° 2κ° μ΄μμ΄κ±°λ, λλλ λ¬Έμμ΄μΌ κ²½μ° νμλ₯Ό μ μ₯ν©λλ€.
μ΄λ, λ¬Έμ μ 쑰건μμ μ²μμλ λ°λμ 1ν λ¬Έμλ₯Ό μ
λ ₯ν΄μΌ νλ―λ‘, νμ 첫 λ¬Έμμμ νμκ° 1μ΄ λν΄μ ΈμΌ νλλ°, λͺ¨λ λ¬Έμμ΄μ 첫 κΈμκ° κ°μ μμλ 1μ΄ λν΄μ§μ§ μμΌλ―λ‘, κ·Έ κ²½μ°λ§ λ°λ‘ νμλ₯Ό 1μ© λν΄μ£Όλ©΄ λ©λλ€.
Description
- ν
μ€νΈ μΌμ΄μ€μ μκ° μ§μ λμ§ μμμΌλ‘ EOFλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. (while (scanf("%d",&N) != EOF))
- char word[100001][81]λ ν λΉ ν¬κΈ°κ° ν¬λ―λ‘ μ§μλ³μκ° μλ μ μλ³μλ‘ μ μΈν©λλ€.
- ν
μ€νΈ μΌμ΄μ€κ° μμΌ μ μμΌλ―λ‘, Trieλ₯Ό μμ ν΄ μ£Όμ΄μΌ ν©λλ€.(delete trie)
- λͺ¨λ λ¬Έμμ΄μ 첫 λ¬Έμκ° κ°μ κ²½μ°μ μ 체 κ°μμμ 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 |