[Gold III] 폴더 정리 (small) - 22860
성능 요약
메모리: 141768 KB, 시간: 612 ms
분류
자료 구조, 그래프 이론, 문자열, 그래프 탐색, 트리, 집합과 맵, 깊이 우선 탐색, 해시를 사용한 집합과 맵
제출 일자
2025년 11월 13일 15:23:51
문제 설명
이름이 main 폴더 안에 여러가지 파일과 폴더가 존재한다.
main
├─ FolderA
│ ├─ File1
│ └─ File2
└─ FolderB
├─ FolderC
├─ File1
└─ File3
위 구조는 main 폴더의 하위 구조를 계층적으로 표시한 것이다. FolderA, FolderB, FolderC는 폴더이고 File1, File2, File3은 파일이다. 파일 이름이 같은 경우는 동일한 파일이다.
한 폴더 안에는 같은 이름의 파일이 두 개 이상 존재할 수 없다.
main 하위 디렉토리에 같은 이름의 폴더가 두 개 이상 존재할 수 없다.
폴더 정리를 하기 위해 main 폴더 하위에 있는 파일들을 확인하려고 한다.
주어지는 쿼리에 대해 폴더와 파일의 정보를 알려주는 프로그램을 만들어보자.
입력
첫 번째 줄에는 main 폴더 하위에 있는 폴더의 총 개수 $N$과 파일의 총 개수 $M$이 공백으로 구분되어 주어진다.
두 번째 줄부터 $N + M + 1$ 번째까지 상위 폴더의 이름 $P$, 폴더 또는 파일의 이름 $F$, 폴더인지 아닌지 알려주는 $C$가 공백으로 구분되어 주어진다.
$C$의 값은 $F$가 폴더라면 1, 파일이라면 0으로 주어진다.
$N + M + 2$ 번째 줄에는 쿼리의 개수 $Q$가 주어진다.
그 다음줄부터 $Q$개의 쿼리가 주어진다. 쿼리마다 main부터 폴더의 경로 정보가 들어온다. 예를 들어 main 폴더 안에 FolderB에 대한 쿼리가 들어온다면, FolderB의 경로인 로 주어진다. 반드시 폴더가 존재하는 경로로 주어짐을 보장한다.main/FolderB
출력
쿼리 순서대로 한 줄씩 폴더 하위에 있는 파일의 종류의 개수와 파일의 총 개수를 출력한다.
파일의 종류의 개수는 같은 파일이 여러개 있을 경우 하나로 계산한다. 파일의 총 개수는 같은 파일이 있더라도 하나로 계산하지 않는다.
예를 들어 이름이 File1 파일이 5개가 있을 경우 파일의 종류는 1 가지이고 파일의 총 개수는 5개이다.
💡 해결 방법
💻 코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
info = dict()
for i in range(n + m):
parent, name, isFolder = input().split()
isFolder = int(isFolder)
if isFolder == 1 and not(name in info):
info[name] = []
try:
info[parent].append((name, isFolder))
except:
info[parent] = [(name, isFolder)]
# print(info)
q = int(input())
for i in range(q):
query = list((input().strip().split('/')))
# print(query)
now = query[-1]
def dfs(folder):
filetype, filec = set(), 0
def _dfs(folder):
nonlocal filetype, filec # 외부 변수 직접 수정
if folder not in info: # 추가 필요!
return
for name, isFolder in info[folder]:
if isFolder == 1:
pass
_dfs(name)
else:
filetype.add(name)
filec += 1
_dfs(folder)
return len(filetype), filec
a, b = dfs(now)
print(a, b)
# print(query)