π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.5670 ν΄λν° μν λ¬Έμ νμ΄ - java
π λ¬Έμ
https://www.acmicpc.net/problem/5670
ν΄λν°μμ κΈΈμ΄κ° PμΈ μλ¨μ΄λ₯Ό μ λ ₯νλ €λ©΄ λ²νΌμ Pλ² λλ¬μΌ νλ€. κ·Έλ¬λ μμ€ν νλ‘κ·Έλλ° μ°κ΅¬μ€μ 근무νλ μΉνμ°κ΅¬μμ μ¬μ μ μ¬μ©ν΄ μ΄ μ λ ₯μ λ 빨리 ν μ μλ μν λͺ¨λμ κ°λ°νμλ€. μ΄ λͺ¨λμ μ¬μ λ΄μμ κ°λ₯ν λ€μ κΈμκ° νλλΏμ΄λΌλ©΄ κ·Έ κΈμλ₯Ό λ²νΌ μ λ ₯ μμ΄ μλμΌλ‘ μ λ ₯ν΄ μ€λ€! μμΈν μλ κ³Όμ μ μ€λͺ νμλ©΄ λ€μκ³Ό κ°λ€.
1. λͺ¨λμ΄ λ¨μ΄μ 첫 λ²μ§Έ κΈμλ₯Ό μΆλ‘ νμ§λ μλλ€. μ¦, μ¬μ μ λͺ¨λ λ¨μ΄κ° κ°μ μνλ²³μΌλ‘ μμνλλΌλ λ°λμ 첫 κΈμλ μ¬μ©μκ° λ²νΌμ λλ¬ μ
λ ₯ν΄μΌ νλ€.
2. κΈΈμ΄κ° 1 μ΄μμΈ λ¬Έμμ΄ c1c2...cnμ΄ μ§κΈκΉμ§ μ
λ ₯λμμ λ, μ¬μ μμ λͺ¨λ c1c2...cnμΌλ‘ μμνλ λ¨μ΄κ° c1c2...cncλ‘λ μμνλ κΈμ cκ° μ‘΄μ¬νλ€λ©΄ λͺ¨λμ μ¬μ©μμ λ²νΌ μ
λ ₯ μμ΄λ μλμΌλ‘ cλ₯Ό μ
λ ₯ν΄ μ€λ€. κ·Έλ μ§ μλ€λ©΄ μ¬μ©μμ μ
λ ₯μ κΈ°λ€λ¦°λ€.
μλ₯Ό λ€λ©΄, μ¬μ μ βhelloβ, βhellβ, βheavenβ, βgoodbyeβ 4κ°μ λ¨μ΄κ° μκ³ μ¬μ©μκ° βhβλ₯Ό μ λ ₯νλ©΄ λͺ¨λμ μλμΌλ‘ βeβλ₯Ό μ λ ₯ν΄ μ€λ€. μ¬μ μμ βhβλ‘ μμνλ λ¨μ΄λ€μ λͺ¨λ κ·Έ λ€μ βeβκ° μ€κΈ° λλ¬Έμ΄λ€. κ·Έλ¬λ λ¨μ΄λ€ μ€ βhelβλ‘ μμνλ κ²λ, βheaβλ‘ μμνλ κ²λ μκΈ° λλ¬Έμ μ¬κΈ°μ λͺ¨λμ μ¬μ©μμ μ λ ₯μ κΈ°λ€λ¦°λ€. μ΄μ΄μ μ¬μ©μκ° βlβμ μ λ ₯νλ©΄ λͺ¨λμ βlβμ μλμΌλ‘ μ λ ₯ν΄ μ€λ€. κ·Έλ¬λ μ¬κΈ°μ λλλ λ¨μ΄μΈ βhellβκ³Ό κ·Έλ μ§ μμ λ¨μ΄μΈ βhelloβκ° κ³΅μ‘΄νλ―λ‘ λͺ¨λμ λ€μ μ λ ₯μ κΈ°λ€λ¦°λ€. μ¬μ©μκ° βhellβμ μ λ ₯νκΈ° μνλ€λ©΄ μ¬κΈ°μ μ λ ₯μ λ©μΆ κ²μ΄κ³ , βhelloβλ₯Ό μ λ ₯νκΈ° μνλ€λ©΄ μ§μ βoβ λ²νΌμ λλ¬μ μ λ ₯ν΄ μ€μΌ νλ€. λ°λΌμ βhelloβλ₯Ό μ λ ₯νλ €λ©΄ μ¬μ©μλ μ΄ 3λ² λ²νΌμ λλ¬μΌ νκ³ , βhellβ, βheavenβμ 2λ²μ΄λ€. βheavenβμ κ²½μ° βheβμμ βaβλ₯Ό μ λ ₯νλ©΄ λ°λ‘ λ·λΆλΆμ΄ λͺ¨λ μλμΌλ‘ μ λ ₯λκΈ° λλ¬Έμ΄λ€. λΉμ·νκ², βgoodbyeβλ λ¨ ν λ²λ§ λ²νΌμ λλ¬λ μ λ ₯μ΄ μλ£λ κ²μ΄λ€. βgβλ₯Ό μ λ ₯νλ μκ° λ€μ μ€λ κΈμκ° νμ μ μΌνλ―λ‘ λκΉμ§ μλμΌλ‘ μ λ ₯λκΈ° λλ¬Έμ΄λ€. μ΄λ μ¬μ μ μλ λ¨μ΄λ€μ μ λ ₯νκΈ° μν΄ λ²νΌμ λλ¬μΌ νλ νμμ νκ· μ (3 + 2 + 2 + 1)/4 = 2.00μ΄λ€.
μ¬μ μ΄ μ£Όμ΄μ‘μ λ, μ΄ λͺ¨λμ μ¬μ©νλ©΄μ μ΄μ κ°μ΄ κ° λ¨μ΄λ₯Ό μ λ ₯νκΈ° μν΄ λ²νΌμ λλ¬μΌ νλ νμμ νκ· μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
π μ κ·Όλ²
Q.5670 ν΄λν° μν λ¬Έμ μ λλ€.
μ¬λ¬κ°μ§ μμ΄ λ¨μ΄λ€μ΄ μ μ₯ λμ΄ μμ΅λλ€. κ·Έλ¦¬κ³ μνλ λ¨μ΄λ₯Ό μλμμ±μ μ΄μ©ν΄ μ΄μ κ°μ΄ κ° λ¨μ΄λ₯Ό μ λ ₯νκΈ° μν΄ λ²νΌμ λλ¬μΌ νλ νμμ νκ· μ ꡬνλ λ¬Έμ μ λλ€.
λ¨μ΄μ μλμμ±, λνμ μΈ Trie μκ³ λ¦¬μ¦ λ¬Έμ μ€ νλμ λλ€.
Trieλ₯Ό μ΄μ©ν΄ νμ΄κ° κ°λ₯ν©λλ€.
Trieλ₯Ό λ§λ€μ΄ Trieμ κ° λ¨μ΄λ€μ λͺ¨λ μ μ₯ν΄μ€λλ€.
κ·Έ ν μνλ λ¨μ΄λ₯Ό Trieλ₯Ό μ΄μ©ν΄ νμν©λλ€.
μ΄λ μλμμ± κΈ°λ₯μ μ΄μ©νκΈ° μν΄ μ£Όμ΄μ§ μ‘°κ±΄μ΄ μμ΅λλ€.
λ°λ‘ λ€μ κ²½μ°μ μκ° νκ°μ§μ΄μ΄μΌλ§ λ°λ‘ μλμμ±μ΄ κ°λ₯ν©λλ€.
λ€μμ μ¬ μ μλ μνλ²³ κ²½μ°μ μκ° λκ°μ§ μ΄μμ΄λΌλ©΄ λ°λμ μ¬μ©μμ μ λ ₯μ΄ νμν©λλ€.
κ·Έλ¦¬κ³ λν μ΄λ―Έ μ΄λ ν λ¨μ΄κ° μμ±μ΄ λμμ λ κ·Έ λ€λ‘ μλ‘μ΄ μνλ²³μ΄ μ΄μ΄μ Έ λ€μ λ¨μ΄λ₯Ό νμνκΈ° μν΄μλ
μ¬μ©μμ μ λ ₯μ΄ νμν©λλ€.
Trie νμμ μ΄λ₯Ό μ΄μ©νλ©΄ λ΅μ ꡬν μ μμ΅λλ€.
//μμλ
Έλ ν¬κΈ°κ° 2μ΄μμ΄λ©΄ μ νμ§κ° 2κ°μ§ μ΄μμ΄λ―λ‘ μ
λ ₯ν΄μΌνλ€
if(thisNode.childNodes.size() >= 2){
count++;
}
//μμ λ
Έλκ° νλλΌλ©΄ μλμμ±μ΄ λμ§λ§ λ§μ½ μ΄λ―Έ λ¬Έμμ΄μ΄ μμ± λ μνλΌλ©΄ λ€λ₯Έ λ¬Έμμ΄μ μν΄ μ
λ ₯ν΄μΌνλ€.
if(thisNode.childNodes.size() == 1 && thisNode.isLastString){
count++;
}
π» μ½λ
package problem.string.trie;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main_5670 {
static int n;
static Trie trie;
static String[] word;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
while ( (input = br.readLine()) != null ){
n = Integer.parseInt(input);
word = new String[n];
for(int i=0; i<n; i++){
word[i] = br.readLine();
}
inputTrie();
solve();
}
}
private static void inputTrie() {
Arrays.sort(word);
trie = new Trie();
for(int i=0; i<n; i++){
trie.insert(word[i]);
}
}
private static void solve(){
int count = 0;
Arrays.sort(word);
for(int i=0; i<n; i++) {
int result = trie.contains(word[i]);
count+=result;
}
System.out.println(String.format("%.2f",(double)count/n));
}
static class TrieNode {
public Map<Character, TrieNode> childNodes = new HashMap<>();
private boolean isLastString;
public Map<Character, TrieNode> getChildNodes() {
return this.childNodes;
}
public boolean isLastString() {
return this.isLastString;
}
public void setLastString(boolean lastString) {
this.isLastString = lastString;
}
}
static class Trie {
private TrieNode rootNode;
public Trie() {
rootNode = new TrieNode();
}
// μμ λ
Έλ μΆκ°
boolean insert(String str) {
TrieNode thisNode = this.rootNode;
for (int i = 0; i < str.length(); i++) {
char currentString = str.charAt(i);
if(thisNode.childNodes.get(currentString) == null){
thisNode.childNodes.put(currentString,new TrieNode());
}
thisNode = thisNode.childNodes.get(currentString);
}
thisNode.setLastString(true);
return true;
}
int contains(String str) {
TrieNode thisNode = this. rootNode;
int count = 1;
thisNode = thisNode.childNodes.get(str.charAt(0));
for (int i = 1; i < str.length(); i++) {
char currentChar = str.charAt(i);
//μμλ
Έλ ν¬κΈ°κ° 2μ΄μμ΄λ©΄ μ νμ§κ° 2κ°μ§ μ΄μμ΄λ―λ‘ μ
λ ₯ν΄μΌνλ€
if(thisNode.childNodes.size() >= 2){
count++;
}
//μμ λ
Έλκ° νλλΌλ©΄ μλμμ±μ΄ λμ§λ§ λ§μ½ μ΄λ―Έ λ¬Έμμ΄μ΄ μμ± λ μνλΌλ©΄ λ€λ₯Έ λ¬Έμμ΄μ μν΄ μ
λ ₯ν΄μΌνλ€.
if(thisNode.childNodes.size() == 1 && thisNode.isLastString){
count++;
}
thisNode = thisNode.childNodes.get(currentChar);
}
return count;
}
}
}