본문 바로가기

TIL

백준 22860 폴더 정리(python)

문제

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


정글에서 알고리즘 Week1 주제 중에 재귀가 있었는데, 재귀 복습도 하고 파이썬에 익숙해지기 위해서 따로 풀어 봤다.

기본적인 전략은 재귀이긴 한데, 주어진 조건에 맞게 파일 구조를 어떻게 구현해 내냐가 중요한 것 같다. 나는 폴더와 파일을 같이 한 폴더에 집어넣어 주는 것처럼 구현을 했는데, 한 폴더 안에 문제의 조건과 똑같이 폴더 파일 나눠서 구현하는 것이 더 효율적일 것 같다.


소스코드 

import sys
sys.setrecursionlimit(10**8)

input = sys.stdin.readline

direc = {} #폴더 디렉토리
f_num = 0


def go(target, kinds): #탐색할 함수
    global f_num
    if target not in direc: #현재 탐색할 주체가 파일이나 폴더가 없다면 종료한다
        return

    for title, val in direc[target]:
        if val == 0:
            if title not in kinds: #title은 파일명
                kinds.add(title)
            f_num += 1

        else: #폴더라면 더 탐색해서 들어감
            go(title, kinds)

    return


N, M = map(int, input().split())

for i in range(N+M):
    From, To, Id = input().rstrip().split()
    if From not in direc:
        direc[From] = []
        direc[From].append([To, int(Id)])
    else:
        direc[From].append([To, int(Id)])


q = int(input())

for i in range(q):
    query = input().rstrip().split('/')
    SET = set()
    f_num = 0
    go(query[-1], SET)

    print(len(SET), f_num)