• Feed
  • Explore
  • Ranking
/
/
    Problem Solving

    [Baekjoon] 폴더 정리 (small)

    폴더 정리 (small)_22860 [골드3]
    DFSHashMapImplementation백준
    h
    hyeonZIP
    2026.01.20
    ·
    3 min read

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

    import java.io.*;
    import java.util.*;
    
    public class Main {
        private static StringBuilder answer = new StringBuilder();
        private static int N, M, Q;
        private static int fileCount;
        private static Set<String> fileType;
        private static String[][] query;
        private static Map<String, List<String>> folderManager = new HashMap<>();
        private static Map<String, List<String>> fileManager = new HashMap<>();
    
        public static void main(String[] args) throws IOException {
            init();
            sol();
            print();
        }
    
        private static void sol() {
            for (String[] q : query) {
                fileType = new HashSet<>();
                fileCount = 0;
    
                String lastFolder = q[q.length - 1];
    
                dfs(lastFolder);
    
                answer.append(fileType.size()).append(" ").append(fileCount).append("\n");
            }
        }
    
        private static void dfs(String folderName) {
            List<String> currentFileList = fileManager.getOrDefault(folderName, new ArrayList<>());
            fileCount += currentFileList.size();
            fileType.addAll(currentFileList);
    
            for (String folder : folderManager.getOrDefault(folderName, new ArrayList<>())) {
                dfs(folder);
            }
        }
    
        private static void init() throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st;
    
            st = new StringTokenizer(br.readLine());
    
            N = Integer.parseInt(st.nextToken());// 폴더 개수
            M = Integer.parseInt(st.nextToken());// 파일 개수
    
            for (int i = 0; i < N + M; i++) {
                st = new StringTokenizer(br.readLine());
    
                String parent = st.nextToken();// 상위 폴더
                String child = st.nextToken();// 자식 폴더 또는 파일
                int isForder = Integer.parseInt(st.nextToken());// 폴더면 1 아니면 0
    
                if (isForder == 1) {
                    List<String> folderList = folderManager.getOrDefault(parent, new ArrayList<>());
                    folderList.add(child);
                    folderManager.put(parent, folderList);
                } else {
                    List<String> fileList = fileManager.getOrDefault(parent, new ArrayList<>());
                    fileList.add(child);
                    fileManager.put(parent, fileList);
                }
            }
    
            Q = Integer.parseInt(br.readLine());
    
            query = new String[Q][];
    
            for (int i = 0; i < Q; i++) {
                query[i] = br.readLine().split("/");
            }
        }
    
        private static void print() throws IOException {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            bw.write(String.valueOf(answer));
            bw.close();
        }
    }

    주요 개념

    • HashMap

    • DFS

    • 구현

    풀이 방법

    • 문제의 정답은 파일의 종류와 파일의 갯수이다.

      • 여기서 file1은 파일의 이름이라기 보다 종류로 봐야하기 때문에 main/file1과 main/folderA/file1은 같은 종류이며 2개의 파일이다.

    • 상위 폴더와 하위 폴더의 정보를 저장하는 folderManager 와 폴더에 존재하는 파일 정보를 저장하는 fileManager 로 해결한다.

      • 각 value는 List<String>으로 저장한다.

    • 문제에서 폴더내에 폴더가 존재할 수 있는데 제한이 없다.

      • 즉, 폴더내의 폴더를 반복해서 탐색할 수 있는 로직이 필요하다 -> DFS

    • 파일의 갯수는 단순 덧셈, 파일의 종류는 HashSet 자료형을 이용한다.







    - 컬렉션 아티클