์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[ ๋ฐฑ์ค€ / BOJ 22861 ] ํด๋” ์ •๋ฆฌ - large ( JAVA / ์ž๋ฐ” )

KIMHYEYUN 2022. 2. 22. 18:11
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/22861

 

22861๋ฒˆ: ํด๋” ์ •๋ฆฌ (large)

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” main ํด๋” ์•ˆ์— ์žˆ๋Š” ํด๋”์˜ ์ด ๊ฐœ์ˆ˜ $N$๊ณผ ํŒŒ์ผ์˜ ์ด ๊ฐœ์ˆ˜ $M$์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ $N + M + 1$ ๋ฒˆ์งธ๊นŒ์ง€ ์ƒ์œ„ ํด๋”์˜ ์ด๋ฆ„ $P$, ํด๋” ๋˜๋Š” ํŒŒ์ผ์˜ ์ด๋ฆ„ $F$,

www.acmicpc.net

๋ฌธ์ œ

์ด๋ฆ„์ด 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);
        }
    }
}
728x90
๋ฐ˜์‘ํ˜•