λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 22860번 - 폴더 정리 (small)

by μ•ˆμ£Όν˜• 2022. 9. 21.

문제

 

22860번: 폴더 정리 (small)

main 폴더 ν•˜μœ„μ—λŠ” FolderA 폴더 ν•˜μœ„μ— μžˆλŠ” File1, File2, FolderB 폴더 ν•˜μœ„μ— μžˆλŠ” File1, File3이 μžˆλ‹€. 파일의 μ’…λ₯˜λŠ” File1, File2, File3 총 3가지이고, 파일의 총 κ°œμˆ˜λŠ” File1, File2, File1, File3 총 4κ°œμ΄λ‹€. mai

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>
#include <unordered_map>
#include <sstream>

using namespace std;

int N, M;
unordered_map<string, vector<pair<int ,string>>> graph;
unordered_map<string, int> visited;
int file_cnt, file_type_cnt;

void dfs(string node){
    for(auto it: graph[node]){
        if(it.first == 0){
            if(!visited[it.second]){
                visited[it.second] = 1;
                file_type_cnt++;
            }
            file_cnt++;
        }
        if(it.first == 1){
            dfs(it.second);
        }
    }
}


vector<string> parsing(string s){
    vector<string> v;
    istringstream ss(s);
    string stringbuffer;
    
    while(getline(ss, stringbuffer, '/')){
        v.push_back(stringbuffer);
    }
    return v;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>N>>M;
    for(int i=0; i<N+M; i++){
        string P, E; int C; cin>>P>>E>>C;
        vector<pair<int ,string>> v = graph[P];
        v.push_back({C, E});
        graph[P] = v;
    }
    int Q; cin>>Q;
    for(int i=0; i<Q; i++){
        string s; cin>>s;
        vector<string> v = parsing(s);
        dfs(v.back());
        cout<<file_type_cnt << ' '<< file_cnt << '\n';
        file_cnt = 0;
        file_type_cnt = 0;
        visited.clear();
    }
}

 

풀이

dfs문제인데, λ…Έλ“œμ˜ 정보듀을 map을 잘 ν™œμš©ν•΄μ„œ μ €μž₯ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. 

λ…Έλ“œμ˜ 정보λ₯Ό μ €μž₯ν•˜λŠ” 뢀뢄은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. unordered_map<string, vector<pair<int ,string>>> graph;

3 4
main FolderA 1
main FolderB 1
FolderA File1 0
FolderA File2 0
FolderB FolderC 1
FolderB File1 0
FolderB File3 0

λ‹€μŒ μž…μΆœλ ₯을 μ˜ˆμ‹œλ‘œ λ“€μ–΄ graph에 μ €μž₯ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • [main] = {{1, "FolderA"}, {1, "FolderB"}
  • [FolderA] = {{0, "File1"}, {0, "File2"}}
  • [FolderB] = {{1, "FolderC"}, {0, "File1}, {0, "File3"}}

κ·Έ ν›„ dfsλ₯Ό μ΄μš©ν•˜μ—¬ ν΄λ”μΌκ²½μš° 계속 μ§„μž…ν•˜μ—¬ νƒμƒ‰ν•˜λ©΄μ„œ 파일의 개수λ₯Ό μ°Ύμ•„μ£Όλ©΄ λ©λ‹ˆλ‹€.

μ‹œκ°„ λ³΅μž‘λ„λŠ” dfs: O(N), 쿼리 개수: O(Q) μ΄λ―€λ‘œ O(N^2)이 μ†Œμš”λ©λ‹ˆλ‹€.

λŒ“κΈ€