๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/9934
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
์๊ทผ์ด๊ฐ ๋์๋ฅผ ๋ฐฉ๋ฌธํ ์กฐ๊ฑด์ ์ดํด๋ณด๋ฉด ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋์๊น์ง ๋ฐฉ๋ฌธํ ํ ๊ทธ ๋ถ๋ชจ๋ฅผ ๋ฐฉ๋ฌธ ํ ๋ค ๋ค์ ์ค๋ฅธ์ชฝ์ ํ์ํ๋ค.
์ฆ, inorder ์ค์ ์ํ ๋ฐฉ์๊ณผ ๋์ผํ๋ค.
์๊ทผ์ด๊ฐ ๋ฐฉ๋ฌธํ ๋์์ ํธ๋ฆฌ ๋ชจ์์ ํํํด์ค์ผ ํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ฏ๋ก, ๋ ธ๋ ๋ฒํธ๊ฐ 1, 2, 3 ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์๋ก ๋ง๋ค์ด์คฌ๋ค.
์๋ก ๋ง๋ ํธ๋ฆฌ๋ฅผ ์ด์ฉํด ์ค์ ์ํ๋ฅผ ํ ํ ๋ฐฉ๋ฌธํ ๋์๋ค์ ์คํ์ ์ ์ฅํ๋ค.
์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋์์ ์คํ์ ์ ์ฅํ ๋์๊ฐ ๋์ผํ ์์์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋์์ ์คํ์ ์ ์ฅํ ๋์๋ฅผ ํ๋์ ํด๋์ค๋ก ๋งคํํด์ค ๋ค ์๋ก ๋ง๋ ํธ๋ฆฌ์ ๋ชจ์๋๋ก ๋ง๋ค์ด์ค๋ค.
์๋ก ๋ง๋ ํธ๋ฆฌ๋ ๋ ธ๋ ๋ฒํธ๊ฐ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ์์ ์ด์ง ํธ๋ฆฌ์ด๋ฏ๋ก ์๋ก ๋ง๋ ๊ฐ์ฒด๋ฅผ ๋ ธ๋ ๋ฒํธ ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํด์ค ํ ๋งคํ ๋ ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ ธ๋๋ฅผ ๋ ๋ฒจ ์์ผ๋ก ์ถ๋ ฅํด์ค๋ค.
- ๋ ธ๋ ๋ฒํธ๊ฐ 1,2,3 … ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
- ์๋ก ๋ง๋ ํธ๋ฆฌ๋ฅผ ์ด์ฉํด ์ค์ ์ํ๋ฅผ ํ ๋ฐฉ๋ฌธ ๋์ Path๋ฅผ ๋ง๋ค์ด ์ค๋ค.
- ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ฐฉ๋ฌธ ๋์์ ์๋กญ๊ฒ ๋ง๋ ํธ๋ฆฌ์ ๋ฐฉ๋ฌธ ๋์๋ ๋์ผํ ์์์์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์๋ก ํ๋์ ํด๋์ค๋ก ๋งคํํด์ค๋ค.
- ํ๋์ ํด๋์ค๋ฅผ ์๋ก ๋ง๋ ํธ๋ฆฌ์ ๋ ธ๋ ๋ฒํธ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ค๋ค.
- ์๋ก ๋ง๋ ํธ๋ฆฌ์ 1๋ฒ ๋ ธ๋ ๋ถํฐ ์ฐจ๋ก๋ก ๋งคํ๋ ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ฐฉ๋ฌธ ๋์๋ฅผ ๋ ๋ฒจ ์์ผ๋ก ์ถ๋ ฅํด์ค๋ค.
๐ฉ Java ์ฝ๋
package com.algorithm.Baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main_9934_์์ _์ด์ง_ํธ๋ฆฌ {
static class Node {
private int node;
private int left;
private int right;
public Node(int node, int left, int right) {
this.node = node;
this.left = left;
this.right = right;
}
public int getNode() {
return node;
}
public int getLeft() {
return left;
}
public int getRight() {
return right;
}
public void setNode(int node) {
this.node = node;
}
public void setLeft(int left) {
this.left = left;
}
public void setRight(int right) {
this.right = right;
}
}
static class City implements Comparable<City> {
private int inputPath;
private int makePath;
public City(int inputPath, int makePath) {
this.inputPath = inputPath;
this.makePath = makePath;
}
public int getInputPath() {
return inputPath;
}
@Override
public int compareTo(City o) {
return Integer.compare(this.makePath, o.makePath);
}
}
private static Stack<Integer> path, makePath;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
path = new Stack<>();
makePath = new Stack<>();
int N = Integer.parseInt(br.readLine());
// ์ด์ง ํธ๋ฆฌ ์ด๊ธฐํ
Map<Integer, Node> tree = new HashMap<>();
for (int node = 1; node < (int) Math.pow(2, N); node++) {
tree.put(node, new Node(node, 0, 0));
}
// ์๊ทผ์ด๊ฐ ๋ฐฉ๋ฌธํ ๋์ ๋ฒํธ ์ ์ฅ
StringTokenizer st = new StringTokenizer(br.readLine());
for(int loop = 1; loop < (int) Math.pow(2, N); loop++) {
path.push(Integer.parseInt(st.nextToken()));
}
// ๋ฃจํธ๋ฅผ 1 2 3 ์์ผ๋ก ์์ํ๋ ์์ ์ด์งํธ๋ฆฌ ๋ง๋ค๊ธฐ
for(int level = 1; level < N; level++) {
for(int node = (int) Math.pow(2, level); node < (int) Math.pow(2, level+1); node++) {
if(node % 2 == 0) tree.get(node / 2).setLeft(node);
else tree.get(node / 2).setRight(node);
}
}
// ์๋ก ๋ง๋ ์ด์งํธ๋ฆฌ๋ฅผ ์ด์ฉํด ๋ฐฉ๋ฌธ ์กฐ๊ฑด(inorder)์ ๋ฐ๋ผ ๊ธธ ๋ง๋ค๊ธฐ
inorder(1, tree);
// ์๊ทผ์ด์ ๋์ ์ถ๋ ฅ
makeCity(N);
br.close();
}
private static void makeCity(int n) {
List<City> city = new ArrayList<>();
// 1 2 3 ์์์ ์ด์ง ํธ๋ฆฌ๋ก ๋ง๋ ๊ฒฝ๋ก์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋์ ๊ฒฝ๋ก๋ฅผ ํ๋์ ํด๋์ค๋ก ์ ์ฅ
while(!path.isEmpty() && !makePath.isEmpty()) {
city.add(new City(path.pop(), makePath.pop()));
}
// ์๋ก ๋ง๋ ํธ๋ฆฌ๊ฐ 1 2 3 ์์๋ก ๋๋๋ก ์ ๋ ฌ ํ ์ถ๋ ฅ
Collections.sort(city);
int index = 1;
int level = 1;
for (City c : city) {
System.out.print(c.getInputPath()+" ");
if(index == (int) Math.pow(2, level)-1) {
System.out.println();
level++;
}
index++;
}
}
private static void inorder(int node, Map<Integer, Node> tree) {
if(node == 0) return;
inorder(tree.get(node).getLeft(), tree);
makePath.push(node);
inorder(tree.get(node).getRight(), tree);
}
}
'Algorithm > BFS & DFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค, Java] 1039๋ฒ : ๊ตํ (0) | 2022.07.22 |
---|---|
[๋ฐฑ์ค, Java] 19621๋ฒ : ํ์์ค ๋ฐฐ์ 2 (0) | 2022.05.23 |
[๋ฐฑ์ค, Java] 16928๋ฒ : ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์ (0) | 2022.05.09 |
[๋ฐฑ์ค, Java] 1967๋ฒ : ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2022.05.08 |
[๋ฐฑ์ค, Java] 1068๋ฒ : ํธ๋ฆฌ (0) | 2022.05.08 |