Skip to content

Commit 05fd3cf

Browse files
authored
[20260129] BOJ / G3 / 폴더 정리 (small) / 이인희
1 parent 41933e1 commit 05fd3cf

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
```java
2+
import java.io.BufferedReader;
3+
import java.io.IOException;
4+
import java.io.InputStreamReader;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.Iterator;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Set;
11+
12+
public class Main{
13+
static class Folder{
14+
String name;
15+
Set<Folder> folders;
16+
Set<String> files;
17+
Map<String, Integer> lowerFileCountAtName;
18+
Folder(String name){
19+
this.name = name;
20+
folders = new HashSet<>();
21+
files = new HashSet<>();
22+
}
23+
void addFolder(Folder target){
24+
this.folders.add(target);
25+
}
26+
void addFile(String fileName){
27+
this.files.add(fileName);
28+
}
29+
Map<String, Integer> getLowerFileCount(){
30+
if(lowerFileCountAtName == null){
31+
this.lowerFileCountAtName = new HashMap<>();
32+
//해당 폴더의 파일 취합
33+
Iterator<String> iterFile = files.iterator();
34+
while(iterFile.hasNext()){
35+
String fileName = iterFile.next();
36+
lowerFileCountAtName.put(fileName, lowerFileCountAtName.getOrDefault(fileName, 0) + 1);
37+
}
38+
39+
//dfs로 가장 안쪽까지 가서 해당 폴더의 lowerFileCountAtName을 구함
40+
Iterator<Folder> iter = folders.iterator();
41+
while(iter.hasNext()){
42+
Folder childFolder = iter.next();
43+
Map<String, Integer> lfcOfChildFolder = childFolder.getLowerFileCount();
44+
for(Map.Entry<String, Integer> entry : lfcOfChildFolder.entrySet()){
45+
lowerFileCountAtName.put(entry.getKey(), lowerFileCountAtName.getOrDefault(entry.getKey(), 0) + entry.getValue());
46+
}
47+
}
48+
}
49+
50+
return lowerFileCountAtName;
51+
}
52+
}
53+
private static int N, M, Q;
54+
private static Map<String, Folder> FolderAtName;
55+
public static void main(String[] args) throws IOException {
56+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
57+
FolderAtName = new HashMap<>();
58+
try{
59+
createFolder("main");
60+
}catch(NullPointerException e){
61+
throw new RuntimeException("createFolder 에러");
62+
}
63+
String[] tokens = br.readLine().split(" ");
64+
N = Integer.parseInt(tokens[0]);
65+
M = Integer.parseInt(tokens[1]);
66+
67+
for(int i = 0; i<N+M; i++){
68+
tokens = br.readLine().split(" ");
69+
String srcName = tokens[0];
70+
Folder src = FolderAtName.get(srcName);
71+
if(src == null){
72+
src = createFolder(srcName);
73+
}
74+
String targetName = tokens[1];
75+
if("1".equals(tokens[2])){
76+
//폴더
77+
src.addFolder(createFolder(targetName));
78+
}else{
79+
//파일
80+
src.addFile(targetName);
81+
}
82+
}
83+
Q = Integer.parseInt(br.readLine());
84+
int q = Q;
85+
while(q-->0){
86+
tokens = br.readLine().split("/");
87+
Folder target = FolderAtName.get(tokens[tokens.length-1]);
88+
Map<String, Integer> temp = target.getLowerFileCount();
89+
int answer = 0;
90+
for(int c : temp.values()){
91+
answer += c;
92+
}
93+
System.out.println(temp.size() + " " + answer);
94+
}
95+
br.close();
96+
}
97+
98+
private static Folder createFolder(String name) {
99+
FolderAtName.putIfAbsent(name, new Folder(name));
100+
return FolderAtName.get(name);
101+
}
102+
}
103+
```

0 commit comments

Comments
 (0)