diff --git "a/LiiNi-coder/202601/29 BOJ \355\217\264\353\215\224 \354\240\225\353\246\254 (small).md" "b/LiiNi-coder/202601/29 BOJ \355\217\264\353\215\224 \354\240\225\353\246\254 (small).md" new file mode 100644 index 00000000..6133a66f --- /dev/null +++ "b/LiiNi-coder/202601/29 BOJ \355\217\264\353\215\224 \354\240\225\353\246\254 (small).md" @@ -0,0 +1,103 @@ +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class Main{ + static class Folder{ + String name; + Set folders; + Set files; + Map lowerFileCountAtName; + Folder(String name){ + this.name = name; + folders = new HashSet<>(); + files = new HashSet<>(); + } + void addFolder(Folder target){ + this.folders.add(target); + } + void addFile(String fileName){ + this.files.add(fileName); + } + Map getLowerFileCount(){ + if(lowerFileCountAtName == null){ + this.lowerFileCountAtName = new HashMap<>(); + //해당 폴더의 파일 취합 + Iterator iterFile = files.iterator(); + while(iterFile.hasNext()){ + String fileName = iterFile.next(); + lowerFileCountAtName.put(fileName, lowerFileCountAtName.getOrDefault(fileName, 0) + 1); + } + + //dfs로 가장 안쪽까지 가서 해당 폴더의 lowerFileCountAtName을 구함 + Iterator iter = folders.iterator(); + while(iter.hasNext()){ + Folder childFolder = iter.next(); + Map lfcOfChildFolder = childFolder.getLowerFileCount(); + for(Map.Entry entry : lfcOfChildFolder.entrySet()){ + lowerFileCountAtName.put(entry.getKey(), lowerFileCountAtName.getOrDefault(entry.getKey(), 0) + entry.getValue()); + } + } + } + + return lowerFileCountAtName; + } + } + private static int N, M, Q; + private static Map FolderAtName; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + FolderAtName = new HashMap<>(); + try{ + createFolder("main"); + }catch(NullPointerException e){ + throw new RuntimeException("createFolder 에러"); + } + String[] tokens = br.readLine().split(" "); + N = Integer.parseInt(tokens[0]); + M = Integer.parseInt(tokens[1]); + + for(int i = 0; i0){ + tokens = br.readLine().split("/"); + Folder target = FolderAtName.get(tokens[tokens.length-1]); + Map temp = target.getLowerFileCount(); + int answer = 0; + for(int c : temp.values()){ + answer += c; + } + System.out.println(temp.size() + " " + answer); + } + br.close(); + } + + private static Folder createFolder(String name) { + FolderAtName.putIfAbsent(name, new Folder(name)); + return FolderAtName.get(name); + } +} +```