개발조아

[BOJ/백준] 22860 폴더 정리(small) 파이썬 본문

알고리즘/백준

[BOJ/백준] 22860 폴더 정리(small) 파이썬

개발조아 2021. 10. 6. 00:02
728x90

문제 링크 : https://www.acmicpc.net/problem/22860

 

22860번: 폴더 정리 (small)

main 폴더 하위에는 FolderA 폴더 하위에 있는 File1, File2, FolderB 폴더 하위에 있는 File1, File3이 있다. 파일의 종류는 File1, File2, File3 총 3가지이고, 파일의 총 개수는 File1, File2, File1, File3 총 4개이다. mai

www.acmicpc.net

 

그냥 트리 구조 만들어서 했다.

노드는 이름, 종류, 파일 리스트, 폴더 리스트 4가지로 구성했다.

 

그리고 folders라는 딕셔너리에 입력으로 주어지는 폴더 정보의 상위 폴더 노드를 저장했다.

main FolderA 1

FolderA File1 0

위의 두개 입력이 온다면

folders[main]과 folders[FolderA]에 노드를 만들어서 넣어줬다.

트리 구조로 했기 때문에 해당 노드로 바로 접근하기 위해 각 노드를 저장했다.

 

이제 트리를 생성하자.

입력의 상위 폴더가 없다면 상위 폴더 노드를 만들어서 folders에 넣어준다.

그리고 상위 폴더 노드에 파일이면 파일이라면 파일 리스트 이름만 넣고, 폴더라면 folders에서 검색 후 해당 노드를 폴더 리스트에 넣어줬다. 만약 folders에 없다면 노드를 만들어서 저장후 넣어 줬다.

 

다음 쿼리 실행이다.

쿼리는 주어진 경로의 마지막 폴더 명만 빼서 folders에서 해당 노드로 접근한다.

그리고 그 노드부터 하위 폴더까지 탐색하면서 파일을 가져와서 정답을 도출한다.

 

from sys import stdin

class Node(object):
    def __init__(self,name,typ):
        self.name=name
        self.type=typ
        self.file_list = []
        self.folder_list = []

input = stdin.readline
n,m = map(int, input().split())

folders = {}
for _ in range(n+m):
    up,name,typ = input().strip().split()
    if up not in folders:
        node = Node(up,'1')
        folders[up] = node

    if typ == '0':
        folders[up].file_list.append(name)
    else:
        if name not in folders:
            node = Node(name, '1')
            folders[name] = node
        folders[up].folder_list.append(folders[name])

def solv():
    q = int(input())
    for _ in range(q):
        path = input().strip().split('/')
        files = search_folder(path[-1])
        print(len(set(files)), len(files))
def search_folder(now):
    files = []
    for next_folder in folders[now].folder_list:
        files += search_folder(next_folder.name)
    files += folders[now].file_list
    return files
solv()
Comments