본문 바로가기
알고리즘 풀이/백준

[BOJ] 14725. 개미굴 - JAVA

by 2245 2022. 6. 20.

문제 링크

https://www.acmicpc.net/problem/14725

 

14725번: 개미굴

첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N개가 주어진다.  (1 ≤ N ≤ 1000) 두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이

www.acmicpc.net

 

풀이

문제 유형 : 트라이

* 트라이의 기본 코드에 대한 설명 : https://github.com/J00HUI/Algorithm-Codes/blob/master/trie.md

 

이 문제에서 기본 트라이 문제와 다르게 신경써야 할 점은

1. Map 내에 알파벳 순으로 정렬

2. 트라이 내의 원소들을 원하는 형태로 출력

 

이다. 

먼저 1번은 HashMap 대신 TreeMap 을 써서 해결할 수 있다.

Map<String, Node> childNode = new TreeMap<>();
cs

추가로 보통은 Key 값에 char 형을 넣지만, 두 번째 예제의 경우 문자열이 하나의 노드에 들어가야 하기 때문에 String 을 사용했다.

 

2번 원하는 형태로 출력에서 막혀서 블로그를 참고했다.

Trie 클래스에 print() 메서드를 추가해서 자식노드를 탐색하는 과정에서 문제의 출력형식대로 출력하도록 했다.

print() 의 매개변수로 현재 노드의 높이 정보(floor) 를 넣어 높이의 수 만큼  '--' 가 출력 되도록 한다.

예를 들어, 높이가 1이면 '--' 만 출력되고, 높이가 2라면 '----'가 출력되어야 한다. 

 

void print() {
    print(rootNode, 0);
}
 
void print(Node thisNode, int floor) {
    Set<String> set = thisNode.childNode.keySet();        // thisNode 의 자식노드(Map)의 Key 들을 set 으로 가져옴
    Iterator<String> iter = set.iterator();                // iterator 선언
     
    while(iter.hasNext()) {
        String str = iter.next();                        // Key 
        
        for(int i=0; i<floor; i++) {                    // 높이(depth) 만큼 '--' 을 출력
            sb.append("--");
        }
        
        sb.append(str).append("\n");                    // 키 출력
        
        Node childNodes = thisNode.childNode.get(str);    // thisNode 의 Map 중에서 현재 키를 찾아 노드로 반환
        print(childNodes, floor+1);                        // 반환된 노드의 자식 노드들 재귀로 탐색, floor 1 증가(floor = 높이(depth))
    }
}
cs

 

코드

import java.io.*;
import java.util.*;
 
public class Main_bj_14725_개미굴 {
    
    static StringBuilder sb = new StringBuilder();
    
    static class Node {
        Map<String, Node> childNode = new TreeMap<>();
        boolean endOfStr;
    }
    
    static class Trie {
        
        Node rootNode = new Node();
        
        void insert(String str) {
            StringTokenizer st = new StringTokenizer(str, " ");
            
            int K = Integer.parseInt(st.nextToken());
            Node root = this.rootNode;
            
            for(int i=0; i<K; i++) {
                root = root.childNode.computeIfAbsent(st.nextToken(), key -> new Node());
            }
            
            root.endOfStr = true;
        }
        
        void print() {
            print(rootNode, 0);
        }
        
        void print(Node thisNode, int floor) {
            Set<String> set = thisNode.childNode.keySet();
            Iterator<String> iter = set.iterator();
             
            while(iter.hasNext()) {
                String str = iter.next();
                
                for(int i=0; i<floor; i++) {
                    sb.append("--");
                }
                
                sb.append(str).append("\n");
                
                Node childNodes = thisNode.childNode.get(str);
                print(childNodes, floor+1);
            }
        }
        
    }
 
    public static void main(String[] args) throws Exception {
//        System.setIn(new FileInputStream("res/input_bj_14725.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st;
        
        Trie trie = new Trie();
        for(int i=0; i<N; i++) {
            trie.insert(br.readLine());     // 2 KIWI BANANA
        }
        
        trie.print();
        System.out.println(sb.toString());
        br.close();
    }
 
}
 
cs

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[BOJ] 2234. 성곽 - JAVA  (0) 2022.12.05
[BOJ] 1593. 문자 해독 - JAVA  (0) 2022.07.03
[BOJ] 2631번. 줄 세우기 - JAVA  (0) 2022.05.05
[BOJ] 17143번. 낚시왕 - JAVA  (0) 2022.04.09
[BOJ] 13460번. 구슬 탈출 2  (0) 2022.04.08