[7432]디스크 트리

이준경·2022년 4월 19일
0
import java.util.*;
import java.io.*;

public class Main {
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int N = Integer.parseInt(br.readLine());
		
		//최상위 폴더
		Path root = new Path();
		
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), "\\");
			
			//현재 폴더를 담는 변수. 처음엔 root
			Path p = root;
			
			while (st.hasMoreTokens()) {
				//폴더명 가져옴
				String s = st.nextToken();
				
				//만약 s(하위폴더명)가 p(현재폴더)의 하위 폴더에 있을 경우
				if (p.map.containsKey(s)) {
				
					//현재 폴더를 하위 폴더 s로 바꾼다.
					p = p.map.get(s);
				
				} else {
					//새로운 폴더를 생성한다.(새롭게 생성된 폴더에는 하위 폴더가 없다.)
					Path pa = new Path();
					
					//생성한 폴더를 현재 폴더에 넣는다.
					p.map.put(s, pa);
					
					//현재 폴더를 하위 폴더인 pa로 바꾼다.
					p = pa;
				}
			}
		}

		fn(root, "");

		System.out.println(sb);

	}

	//주어진 폴더를 탐색하여 하위 폴더를 순서대로 탐색하고, 탐색한 하위 폴더의 하위 폴더를 다시 탐색하는 재귀 함수.  
	static void fn(Path path, String tap) {

		//현재 폴더에 있는 하위 폴더를 순서대로 탐색한다.
		for (String s : path.map.keySet()) {
		
			//tap(깊이와 동일한 띄어쓰기) + 하위 폴더명 + 한줄띄기
			sb.append(tap).append(s).append("\n");
			
			//하위폴더를 기준으로 탐색
			fn(path.map.get(s), tap + " ");
		}
	}

	//현재 폴더를 의미하며 하위 폴더를 map으로 가지는 객체
	static class Path {
		//map : 1단계 하위 폴더들의 집합
		//TreeMap으로 사전순 정렬
		Map<String, Path> map = new TreeMap<>();

	}
}

이 문제는 저장된 단어에서 겹치는 단어를 찾는게 아니기 때문에 굳이 character로 map을 구성하지 않고 풀 수 있다. 그래도 character로 설정하여 풀면 시간이 더욱 단축 될 것이다.
(String으로 할 경우 asdf, asdfg 가 있을때 겹치는 부분인 asdf를 두번 돌기 때문임.
character로 한다면 asdf까지 탐색후 boolean 체크하고 boolean의 상태 여부와 상관 없이 하위 문자들을 찾아 나가므로 asdf를 두번 탐색하지 않기 때문이다.)

0개의 댓글

관련 채용 정보