https://www.acmicpc.net/problem/22861
๋ฌธ์
์ด๋ฆ์ด main ํด๋ ์์ ์ฌ๋ฌ๊ฐ์ง ํ์ผ๊ณผ ํด๋๊ฐ ์กด์ฌํ๋ค.
main
โโ FolderA
โ โโ File1
โ โโ File2
โโ FolderB
โโ FolderC
โ โโ File4
โ โโ File5
โโ File1
โโ File3
์ ๊ตฌ์กฐ๋ main ํด๋์ ํ์ ๊ตฌ์กฐ๋ฅผ ๊ณ์ธต์ ์ผ๋ก ํ์ํ ๊ฒ์ด๋ค. FolderA, FolderB, FolderC๋ ํด๋์ด๊ณ File1, File2, File3์ ํ์ผ์ด๋ค. ํ์ผ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ด์ฉ์ด ์์ ๋์ผํ ํ์ผ์ด๋ค.
ํ ํด๋ ์์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ํ์ผ์ด ๋ ๊ฐ ์ด์ ์กด์ฌํ ์ ์๋ค.
main ํด๋์ ํ์ ๋๋ ํ ๋ฆฌ์ ๊ฐ์ ์ด๋ฆ์ ํด๋๊ฐ ๋ ๊ฐ ์ด์ ์กด์ฌํ ์ ์๋ค.
ํด๋ ๋๋ ํ์ผ์ ์ฎ๊ฒจ main ํด๋๋ฅผ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด, FolderB ํด๋ ํ์์ ์๋ ๋ ๊ฐ์ ํ์ผ File1, File3๊ณผ ํ๋์ ํด๋ FolderC๋ฅผ FolderA ํด๋ ํ์์ ์ฎ๊ธฐ๋ ค๊ณ ํ๋ค.
File1 ํ์ผ์ FolderA ํด๋ ์์ ๋์ผํ ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก ๋ฎ์ด์ด๋ค. File3์ ๋์ผํ ํ์ผ์ด ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์ฎ๊ธด๋ค. FolderC ํด๋๋ ๋์ผํ ํด๋๊ฐ ์์ผ๋ฏ๋ก FolderA ํด๋ ํ์์ ์ฎ๊ธด๋ค. FolderB ํด๋ ํ์์ ์๋ ํด๋์ ํ์ผ์ ๋ค ์ฎ๊ฒผ์ผ๋ฏ๋ก FolderB๋ ์ญ์ ํ๋ค.
์๋๋ FolderB ํด๋๋ฅผ FolderA ํด๋ ์์ ์ฎ๊ธด ํ main ํด๋์ ํ์ ๊ตฌ์กฐ๋ฅผ ๊ณ์ธต์ ์ผ๋ก ํ์ํ ๊ฒ์ด๋ค.
main
โโ FolderA
โโ FolderC
โ โโ File4
โ โโ File5
โโ File1
โโ File2
โโ File3
์ด๋ฌํ ๊ณผ์ ์ ํตํด ํด๋๋ฅผ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค. ํด๋ ์ ๋ฆฌ ํ ์ฟผ๋ฆฌ๋ฅผ ํตํ์ฌ ํ์ผ์ ์ ๋ณด๋ฅผ ํ์ธํ๋ ค๊ณ ํ๋ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ main ํด๋ ์์ ์๋ ํด๋์ ์ด ๊ฐ์ N๊ณผ ํ์ผ์ ์ด ๊ฐ์ M์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
๋ ๋ฒ์งธ ์ค๋ถํฐ N+M+1๋ฒ์งธ๊น์ง ์์ ํด๋์ ์ด๋ฆ P, ํด๋ ๋๋ ํ์ผ์ ์ด๋ฆ F, ํด๋์ธ์ง ์๋์ง ์๋ ค์ฃผ๋ C๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
โC์ ๊ฐ์ F๊ฐ ํด๋๋ผ๋ฉด 1, ํ์ผ์ด๋ผ๋ฉด 0์ผ๋ก ์ฃผ์ด์ง๋ค.
โN+M+2๋ฒ์งธ ์ค์๋ ์ฎ๊ธฐ๋ ํ์ K๊ฐ ์ฃผ์ด์ง๋ค.
๊ทธ ๋ค์ ์ค๋ถํฐ ์ด K ์ค์ ๊ฑธ์ณ ํด๋ ๊ฒฝ๋ก A์ ํด๋ ๊ฒฝ๋ก B๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
์ฎ๊ธฐ๋ ํ์๋ ์ ๋ ฅ ์์๋๋ก ์ํ์ด ๋์ด์ผ ํ๋ค.
โA ํ์์ ์๋ ํ์ผ๊ณผ ํด๋๋ค์ Bํ์์ ์ฎ๊ธฐ๋ ๊ฒ์ด๋ค. ์ด๋, A๋ B์ ์์ ํด๋๊ฐ ์๋์ ๋ณด์ฅํ๋ค.
๊ทธ ๋ค์ ์ค์๋ ์ฟผ๋ฆฌ์ ๊ฐ์ Q๊ฐ ์ฃผ์ด์ง๋ค.
๊ทธ ๋ค์ ์ค๋ถํฐ Q๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋ค. ์ฟผ๋ฆฌ๋ง๋ค main์ผ๋ก๋ถํฐ ํด๋์ ๊ฒฝ๋ก ์ ๋ณด๊ฐ ๋ค์ด์จ๋ค. ์๋ฅผ ๋ค์ด main ํด๋ ์์ FolderB์ ๋ํ ์ฟผ๋ฆฌ๊ฐ ๋ค์ด์จ๋ค๋ฉด, FolderB์ ๊ฒฝ๋ก์ธ main/FolderB๋ก ์ฃผ์ด์ง๋ค. ๋ฐ๋์ ํด๋๊ฐ ์กด์ฌํ๋ ๊ฒฝ๋ก๋ก ์ฃผ์ด์ง์ ๋ณด์ฅํ๋ค.
์ถ๋ ฅ
์ฟผ๋ฆฌ ์์๋๋ก ํ ์ค์ฉ ํด๋ ํ์์ ์๋ ํ์ผ์ ์ข ๋ฅ์ ๊ฐ์์ ํ์ผ์ ์ด ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ผ์ ์ข ๋ฅ์ ๊ฐ์๋ ๊ฐ์ ํ์ผ์ด ์ฌ๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ ํ๋๋ก ๊ณ์ฐํ๋ค. ํ์ผ์ ์ด ๊ฐ์๋ ๊ฐ์ ํ์ผ์ด ์๋๋ผ๋ ํ๋๋ก ๊ณ์ฐํ์ง ์๋๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฆ์ด File1 ํ์ผ์ด 5๊ฐ๊ฐ ์์ ๊ฒฝ์ฐ ํ์ผ์ ์ข ๋ฅ๋ 1 ๊ฐ์ง์ด๊ณ ํ์ผ์ ์ด ๊ฐ์๋ 5๊ฐ์ด๋ค.
์ ํ
- $1 \le N \le 1,000$โ
- $1 \le M \le 1,000$โ
- $0 \le K \le 1,000$โ
- $1 \le |P| \le 10$โ
- $1 \le |F| \le 10$โ
- $0 \le C \le 1$โ
- $1 \le Q \le 1,000$
ํ์ด
1) ์ ๋ ฅ๋ฐ๊ธฐ
Input(String parFolder, String name, int isWhat)
parFolder
: ๋ถ๋ชจ ํด๋ ์ด๋ฆname
: ํด๋ ๋๋ ํ์ผ ์ด๋ฆisWhat
: ํด๋์ธ์ง ํ์ผ์ธ์ง ์ฌ๋ถ (0 → ํ์ผ, 1 → ํด๋)
1-1) ํ์ผ์ด๋ผ๋ฉด,HashMap<String, HashSet<String>> haveFiles
parFolder๋ฅผ key๋ก name ์ถ๊ฐ
1-2) ํด๋๋ผ๋ฉด,HashMap<String, HashSet<String>> haveFolders
parFolder๋ฅผ key๋ก name ์ถ๊ฐ
โ value๋ฅผ HashSet์ผ๋ก ๋ ์ด์ ๋, ๊ฐ์ ํด๋๋ด์๋ ๊ฐ์ ์ด๋ฆ์ ํ์ผ ๋ฐ ํด๋๊ฐ ์กด์ฌํ ์ ์๊ธฐ ๋๋ฌธ !!
2) ์ด๋ํ๊ธฐ
move(String[] folderA, String[] folderB)
folderA์ ํ์ ํด๋์ ํ์ผ๋ค์ folderB๋ก ์ฎ๊ธฐ๋ ๋ฉ์๋
๊ฐ๋จํ๊ฒhaveFolders
,haveFiles
์ folderA๊ฐ key๋ก ์กด์ฌํ๋ค๋ฉด ๐ ํ์์ ํ์ผ, ํด๋๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ
set์ ๊ฐ๋ค์ folderB ๋ฅผ key๋ก ์ถ๊ฐ
๊ทธ ํ, folderA๋ haveFolders
์ haveFiles
์์ ์ญ์
3) ํ์ ํ์ผ ๊ฐฏ์์ ์ข ๋ฅ ์ฐพ๊ธฐ
find(String[] folders)
- ๋ณ์
cnt
: ์ข ๋ฅ์ ๊ฐฏ์HashSet<String> set
: ํ์ผ์ ๋ด๊ธฐ ์ํ set (โ ์ค๋ณต๋๋ฉด ์๋๊ธฐ ๋๋ฌธ์)
findFolderAndFile(target)
๋ฉ์๋ ํธ์ถ
๐ ๋ง์ฝ target ํ์์ ํด๋๊ฐ ์๋ค๋ฉด, findFolderAndFile(next)
ํธ์ถ
๐ ๋ง์ฝ target ํ์์ ํ์ผ์ด ์๋ค๋ฉด, set์ file ์ถ๊ฐํ๊ณ , cnt+=1
๋๋๋ฉด, cnt์ set์ ํฌ๊ธฐ ์ถ๋ ฅ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main_BOJ_22861_ํด๋์ ๋ฆฌ_large {
static int N, M, K, Q, cnt = 0;
static final int FILE = 0, FOLDER = 1;
static Map<String, HashSet<String>> haveFiles = new HashMap<>();
static Map<String, HashSet<String>> haveFolders = new HashMap<>();
static StringBuilder sb = new StringBuilder();
static Set<String> set;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
M = Integer.parseInt(stringTokenizer.nextToken());
for (int i = 0; i < N + M; i++) {
stringTokenizer = new StringTokenizer(br.readLine());
String parFolder = stringTokenizer.nextToken();
String name = stringTokenizer.nextToken();
int isWhat = Integer.parseInt(stringTokenizer.nextToken());
Input(parFolder, name, isWhat);
}
K = Integer.parseInt(br.readLine());
while (K-- > 0) {
stringTokenizer = new StringTokenizer(br.readLine());
String[] folderA = stringTokenizer.nextToken().split("/");
String[] folderB = stringTokenizer.nextToken().split("/");
move(folderA, folderB);
}
Q = Integer.parseInt(br.readLine());
while (Q-- > 0) {
stringTokenizer = new StringTokenizer(br.readLine());
String[] folders = stringTokenizer.nextToken().split("/");
find(folders);
}
System.out.print(sb);
}
private static void find(String[] folders) {
cnt = 0;
set = new HashSet<>();
String target = folders[folders.length - 1];
findFolderAndFile(target);
sb.append(cnt + " " + set.size()).append("\n");
}
private static void findFolderAndFile(String target) {
if (haveFolders.containsKey(target)) {
for (String nextFolder : haveFolders.get(target)) {
findFolderAndFile(nextFolder);
}
}
if (haveFiles.containsKey(target)) {
for (String file : haveFiles.get(target)) {
set.add(file);
cnt += 1;
}
}
}
private static void move(String[] folderA, String[] folderB) {
String target = folderA[folderA.length - 1];
String dest = folderB[folderB.length - 1];
if (haveFolders.containsKey(target)) {
if(!haveFolders.containsKey(dest)) haveFolders.put(dest, new HashSet<>());
for (String folder : haveFolders.get(target)) {
haveFolders.get(dest).add(folder);
}
haveFolders.remove(target);
}
if (haveFiles.containsKey(target)) {
if(!haveFiles.containsKey(dest)) haveFiles.put(dest, new HashSet<>());
for (String file : haveFiles.get(target)) {
haveFiles.get(dest).add(file);
}
haveFiles.remove(target);
}
String parent = folderA[folderA.length - 2];
haveFolders.get(parent).remove(target);
}
private static void Input(String parFolder, String name, int isWhat) {
if (isWhat == FOLDER) {
if(!haveFolders.containsKey(parFolder)) haveFolders.put(parFolder, new HashSet<>());
haveFolders.get(parFolder).add(name);
} else if (isWhat == FILE) {
if(!haveFiles.containsKey(parFolder)) haveFiles.put(parFolder, new HashSet<>());
haveFiles.get(parFolder).add(name);
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ๋ฐฑ์ค / BOJ 14594 ] ๋๋ฐฉ ํ๋ก์ ํธ - Small ( ์๋ฐ / JAVA ) (0) | 2022.03.08 |
---|---|
[ ๋ฐฑ์ค / BOJ 13460 ] ๊ตฌ์ฌ ํ์ถ 2 ( ์๋ฐ / JAVA ) (0) | 2022.03.06 |
[ BOJ / ๋ฐฑ์ค 17837 ] ์๋ก์ด ๊ฒ์ 2 (0) | 2022.02.22 |
[ ๋ฐฑ์ค / BOJ 21922 ] ํ๋ถ ์ฐ๊ตฌ์ ๋ฏผ์ ( ์๋ฐ / JAVA ) (0) | 2022.02.21 |
[ BOJ / ๋ฐฑ์ค 20165 ] ์ธ๋ด์ ๋๋ฏธ๋ ธ ์ฅ์ธ ํธ์ ( ์๋ฐ / JAVA ) (0) | 2022.02.21 |