일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Java
- 프림
- Pirogramming
- django
- 그래프 탐색
- Database
- 피로그래밍
- 크루스칼
- MST
- 백준
- EC2
- OrderBy
- JOIN
- db
- Baekjoon
- 알고리즘
- 다익스트라
- AWS
- 최단경로
- 프로그래머스
- BFS
- 구현
- 배포
- union find
- SQL
- GROUPBY
- SQL코딩테스트
- 누적합
- 자바
- 코딩테스트
- Today
- Total
NullNull
[백준 P14725] 개미굴 Java 본문
P14725 개미굴 Java
14725번: 개미굴
첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N개가 주어진다. (1 ≤ N ≤ 1000) 두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이
www.acmicpc.net
문제
개미는(뚠뚠) 오늘도(뚠뚠) 열심히(뚠뚠) 일을 하네.
개미는 아무말도 하지 않지만 땀을 뻘뻘 흘리면서 매일 매일을 살길 위해서 열심히 일을 하네.
한 치 앞도(뚠뚠) 모르는(뚠뚠) 험한 이 세상(뚠뚠) 그렇지만(뚠뚠) 오늘도 행복한 개미들!
우리의 천재 공학자 윤수는 이 개미들이 왜 행복한지 궁금해졌다.
행복의 비결이 개미가 사는 개미굴에 있다고 생각한 윤수는 개미굴의 구조를 알아보기 위해 로봇 개미를 만들었다.
로봇 개미는 센서가 있어 개미굴의 각 층에 먹이가 있는 방을 따라 내려가다 더 이상 내려갈 수 없으면 그 자리에서 움직이지 않고 신호를 보낸다.
이 신호로 로봇 개미는 개미굴 각 층을 따라 내려오면서 알게 된 각 방에 저장된 먹이 정보를 윤수한테 알려줄 수 있다.
로봇 개미 개발을 완료한 윤수는 개미굴 탐사를 앞두고 로봇 개미를 테스트 해보기 위해 위 그림의 개미굴에 로봇 개미를 투입했다. (로봇 개미의 수는 각 개미굴의 저장소를 모두 확인할 수 있을 만큼 넣는다.)
다음은 로봇 개미들이 윤수에게 보내준 정보다.
- KIWI BANANA
- KIWI APPLE
- APPLE APPLE
- APPLE BANANA KIWI
(공백을 기준으로 왼쪽부터 순서대로 로봇 개미가 각 층마다 지나온 방에 있는 먹이 이름을 뜻한다.)
윤수는 로봇 개미들이 보내준 정보를 바탕으로 다음과 같이 개미굴의 구조를 손으로 그려봤다.
APPLE
--APPLE
--BANANA
----KIWI
KIWI
--APPLE
--BANANA
(개미굴의 각 층은 "--" 로 구분을 하였다.
또 같은 층에 여러 개의 방이 있을 때에는 사전 순서가 앞서는 먹이 정보가 먼저 나온다.)
우리의 천재 공학자 윤수는 복잡한 개미굴들을 일일이 손으로 그리기 힘들어 우리에게 그려달라고 부탁했다.
한치 앞도 모르는 험한 이세상 그렇지만 오늘도 행복한 개미들!
행복의 비결을 알기 위해 윤수를 도와 개미굴이 어떤 구조인지 확인해보자.
입력값
첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N개가 주어진다. (1 ≤ N ≤ 1000)
두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이 정보 개수 K가 주어진다. (1 ≤ K ≤ 15)
다음 K개의 입력은 로봇 개미가 왼쪽부터 순서대로 각 층마다 지나온 방에 있는 먹이 정보이며 먹이 이름 길이 t는 (1 ≤ t ≤ 15) 이다.
3
2 B A
4 A B C D
2 A C
4
2 KIWI BANANA
2 KIWI APPLE
2 APPLE APPLE
3 APPLE BANANA KIWI
출력값
개미굴의 시각화된 구조를 출력하여라.
개미굴의 각 층을 "--" 로 구분하며, 같은 층에 여러개의 방이 있을 때에는 사전 순서가 앞서는 먹이 정보가 먼저 나온다.
A
--B
----C
------D
--C
B
--A
APPLE
--APPLE
--BANANA
----KIWI
KIWI
--APPLE
--BANANA
알고리즘
트라이를 활용하면 쉽게 풀 수 있다. 트라이가 무엇인지 모른다면 아래의 글을 미리 읽어보길 바란다.
트라이(Trie) 자료구조
트라이 자료구조 트라이(Trie)는 문자열을 저장하고 효율적으로 탐색하기 위한 트리 형태의 자료구조이다. 문자열을 한 자리씩 뽑아내어 트리 형태로 저장한다. 각 노드의 자식들을 탐색하며 저
nullnull.tistory.com
그리고 이 문제는 백준의 디스크 트리 문제와 비슷하다. 아직 문제를 풀지 않았다면 아래 문제도 한 번 풀어보길 바란다.
[백준 P7432] 디스크 트리 Java
P7432 디스크 트리 7432번: 디스크 트리 갑자기 맥북이 상근이의 손에서 떨어졌고, 화면이 켜지지 않았다. AS센터에 문의해보니 수리비가 97만원이 나왔고, 상근이는 큰 혼란에 빠졌다. 돈도 중요하
nullnull.tistory.com
위의 블로그 글에서는 트라이의 각 노드에 문자를 저장했다. 이 문제에서는 트라이의 각 노드에 개미굴에 있는 먹이를 저장하면 된다. 즉, 3 APPLE APPLE KIWI 가 있다면 APPLE → APPLE → KIWI로 트라이에 저장하면 된다. 같은 층에 여러개의 방이 있을 때에는 사전 순서가 앞서는 먹이 정보가 먼저 나오므로 Map에 넣어줄 때 순서를 맞추어주는 TreeMap을 사용하였다.
class Trie {
Map<String, Trie> children;
Trie() {
this.children = new TreeMap<>();
}
}
해당 문제는 특정 디렉토리가 존재하는지 여부를 질의하는 문제가 아니므로 isEnd 변수와 search 메서드는 필요하지 않다. (위의 블로그 글 참고) 따라서, isEnd 변수는 사용하지 않을 것이고 insert와 traverse만 사용하겠다. travsere를 하면서 트라이를 순회할 때 System.out.println문을 추가하여 디렉토리 구조를 출력하도록 했다.
public static void traverse(Trie current, String token) {
for (String key: current.children.keySet()) {
System.out.println(token + key);
traverse(current.children.get(key), token + "--");
}
}
아래는 전체 코드이다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int N;
static Trie root = new Trie();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
String[] wordArr = new String[t];
for (int j = 0; j < t; j++) {
wordArr[j] = st.nextToken();
}
insert(wordArr);
}
traverse(root, "");
}
public static void insert(String[] word) {
Trie current = root;
for (int i = 0, size = word.length; i < size; i++) {
String target = word[i];
if (!current.children.containsKey(target)) {
current.children.put(target, new Trie());
}
current = current.children.get(target);
}
}
public static void traverse(Trie current, String token) {
for (String key: current.children.keySet()) {
System.out.println(token + key);
traverse(current.children.get(key), token + "--");
}
}
}
class Trie {
Map<String, Trie> children;
Trie() {
this.children = new TreeMap<>();
}
}
'알고리즘' 카테고리의 다른 글
[백준 P14950] 정복자 Java (0) | 2023.01.03 |
---|---|
[백준 P5052] 전화번호 목록 Java (0) | 2023.01.02 |
[백준 P7432] 디스크 트리 Java (0) | 2023.01.02 |
트라이(Trie) 자료구조 (0) | 2023.01.02 |
[백준 P13904] 과제 Java (0) | 2023.01.02 |