[백준 22860][Implementation] 폴더정리(small)
백준 22860 폴더정리(small)
폴더 -> 1, 파일 -> 0으로 입력되고, 다음 입력된 경로의 파일의 종류의 개수와 파일의 총 개수(같은 파일이 여러 개 있을 경우 하나로 계산)
풀이 코드
# 22860 폴더 정리(small)
# 폴더 -> 1, 파일 -> 0으로 입력되고, 다음 입력된 경로의 파일의 종류의 개수와 파일의 총 개수(같은 파일이 여러 개 있을 경우 하나로 계산)
import sys
class Node(object):
def __init__(self, name, type):
self.name = name
self.type = typ
self.file_list = []
self.folder_list = []
def append_files(folder):
files = []
for next in folders[folder].folder_list:
files += append_files(next.name)
files += folders[folder].file_list
return files
input = sys.stdin.readline
# 폴더의 총 개수 N, 파일의 총 개수 M
n, m = map(int, input().split())
# 와,, 어떻게 입력을 받아야되지?
# 트리 구조로 받고싶음
folders = {}
for _ in range(n+m):
parent, name, typ = input().strip().split()
# 루트 노드가 없다면(처음 추가될 경우)
if parent not in folders:
node = Node(parent, '1')
folders[parent] = node
# 파일이라면 해당 부모 폴더 파일리스트에 추가
if typ == '0':
folders[parent].file_list.append(name)
# 폴더라면 처음 생긴 폴더만 추가해주면 됨.
else:
if name not in folders:
node = Node(name, '1')
folders[name] = node
folders[parent].folder_list.append(folders[name])
request_num = int(input())
# 출력 형식 -> 파일 종류의 총 개수 / 파일 총 개수
for i in range(request_num):
path = input().strip().split('/') # strip -> 인자로 전달된 문자를 string의 오른족에서 제거
# 이 과정을 재귀로 해야될 것 같음 -> 폴더가 있다면 들어가서 개수 카운트
file_list = append_files(path[-1])
print(len(set(file_list)), len(file_list))
코드 설명
연결 리스트 + 트리처럼 해당 폴더/파일 아래 어떤게 있는지를 추가하는 식으로 입력을 받았다.
또한 폴더/파일 분리를 해서 넣어야 나중에 출력값을 출력하기 위해서 편리하기 때문에 노드에 file_list와 folder_list를 따로 넣어준다.
마지막에 파일 개수를 카운트 하기 위해서는 같은 경우는 재귀를 사용해야될 것 같아서(main의 경로의 경우는 folderA와 folderB 둘 다에 대한 파일 개수를 세야되므로) append_files라는 함수를 통해서 재귀 방식으로 file을 리스트에 추가했다.
댓글남기기