https://www.acmicpc.net/problem/2263
๐ ์๋ฐ(Java)๋ก ํธ๋ ํธ๋ฆฌ์ ์ํ - ๋ฐฑ์ค 2263 ๐ฒ
Inorder + Postorder → Preorder ๋ณต์ํ๊ธฐ
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 2263 - ํธ๋ฆฌ์ ์ํ ๋ฌธ์ ๋,
- ์ด์ง ํธ๋ฆฌ์ Inorder(์ค์ ์ํ) ์ Postorder(ํ์ ์ํ) ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง ๋,
- ์ด์ง ํธ๋ฆฌ์ Preorder(์ ์ ์ํ) ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
๐ก ์์ ์ ๋ ฅ
3
2 1 3
2 3 1
๐ก ์์ ์ถ๋ ฅ
1 2 3
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ ํธ๋ฆฌ๋ฅผ ์ง์ ๋ณต์ํ์ง ์๊ณ ,
โ ์ํ ๊ฒฐ๊ณผ๋ง์ ์ด์ฉํด ๋ฐ๋ก Preorder๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
๐ ํธ๋ฆฌ ์ํ์ ํน์ง ์ดํดํ๊ธฐ
์ํ ๋ฐฉ๋ฒ์์Preorder(์ ์ ์ํ) | ๋ฃจํธ → ์ผ์ชฝ → ์ค๋ฅธ์ชฝ |
Inorder(์ค์ ์ํ) | ์ผ์ชฝ → ๋ฃจํธ → ์ค๋ฅธ์ชฝ |
Postorder(ํ์ ์ํ) | ์ผ์ชฝ → ์ค๋ฅธ์ชฝ → ๋ฃจํธ |
๐ ํต์ฌ ์์ด๋์ด
- Postorder์ ๋ง์ง๋ง ์์๊ฐ ํ์ฌ ์๋ธํธ๋ฆฌ์ ๋ฃจํธ๋ค.
- ๊ทธ ๋ฃจํธ๋ฅผ Inorder์์ ์ฐพ์ผ๋ฉด,
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋ฒ์๋ฅผ ๋๋ ์ ์๋ค.
- Preorder์์๋ ๋ฃจํธ → ์ผ์ชฝ → ์ค๋ฅธ์ชฝ ์์ผ๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค.
๐ Java ์ฝ๋ ์ค๋ช
1. ์ ๋ ฅ ๋ฐ ์ด๊ธฐํ
N = Integer.parseInt(br.readLine());
inOrder = new int[N+1];
postOrder = new int[N+1];
StringTokenizer st1 = new StringTokenizer(br.readLine());
StringTokenizer st2 = new StringTokenizer(br.readLine());
โ inOrder, postOrder๋ฅผ ๊ฐ๊ฐ ์ ๋ ฅ๋ฐ๋๋ค.
โ index ๋ฐฐ์ด์ ์ฌ์ฉํด์ inOrder ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๊ฒ ์ค๋นํ๋ค.
index = new int[N+1];
for (int i = 1; i <= N; i++) {
index[inOrder[i]] = i;
}
2. ํต์ฌ ์ฌ๊ท ํจ์
solve()
static void solve(int is, int ie, int ps, int pe) {
if (ie < is || pe < ps) return;
int root = postOrder[pe]; // ํ์ ์ํ ๋๊ฐ = ํ์ฌ ์๋ธํธ๋ฆฌ ๋ฃจํธ
int rIdx = index[root]; // ์ค์ ์ํ์์ ๋ฃจํธ ์์น ์ฐพ๊ธฐ
sb.append(root + " "); // ์ ์ ์ํ๋ ๋ฃจํธ๋ฅผ ๋จผ์ ์ถ๋ ฅ
int len = rIdx - is; // ์ผ์ชฝ ์๋ธํธ๋ฆฌ ๊ธธ์ด ๊ณ์ฐ
// ์ผ์ชฝ ์๋ธํธ๋ฆฌ ์ฌ๊ท
solve(is, rIdx - 1, ps, ps + len - 1);
// ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ์ฌ๊ท
solve(rIdx + 1, ie, ps + len, pe - 1);
}
โ is, ie: ํ์ฌ Inorder ๋ฒ์
โ ps, pe: ํ์ฌ Postorder ๋ฒ์
โ ๋ฃจํธ๋ฅผ ๋จผ์ ์ฐ๊ณ (Preorder)
โ ์ผ์ชฝ ํธ๋ฆฌ → ์ค๋ฅธ์ชฝ ํธ๋ฆฌ ์์๋ก ์ฌ๊ท ํธ์ถํ๋ค.
3. ์ถ๋ ฅ
System.out.println(sb);
โ ๊ฒฐ๊ณผ๋ StringBuilder๋ก ์ ์ฅํด์ ํ ๋ฒ์ ์ถ๋ ฅํ๋ค.
โ ์ ๋ฆฌ
ํต์ฌ ํฌ์ธํธ | ์ค๋ช |
Postorder ๋ง์ง๋ง ์์ → ํ์ฌ ์๋ธํธ๋ฆฌ ๋ฃจํธ | ๋ฃจํธ ๊ธฐ์ค์ผ๋ก Inorder๋ฅผ ๋๋ ์ผ ํจ |
Inorder์์ ๋ฃจํธ ์์น๋ฅผ ์ฐพ๊ณ | ์ผ์ชฝ/์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๋ฒ์๋ฅผ ๊ณ์ฐ |
Preorder๋ ๋ฃจํธ๋ฅผ ๋จผ์ ์ถ๋ ฅ | ๊ทธ๋ค์ ์ผ์ชฝ → ์ค๋ฅธ์ชฝ ์์ ์ฌ๊ท |
๐ฅ ์ฝ๋ ์ ์ฒด (์ ๋ฆฌ)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class b2263 {
static int N;
static int[] inOrder, postOrder, index;
static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
inOrder = new int[N+1];
postOrder = new int[N+1];
StringTokenizer st1 = new StringTokenizer(br.readLine());
StringTokenizer st2 = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
inOrder[i] = Integer.parseInt(st1.nextToken());
}
for (int i = 1; i <= N; i++) {
postOrder[i] = Integer.parseInt(st2.nextToken());
}
index = new int[N+1];
for (int i = 1; i <= N; i++) {
index[inOrder[i]] = i;
}
sb = new StringBuilder();
solve(1, N, 1, N);
System.out.println(sb);
}
static void solve(int is, int ie, int ps, int pe) {
if (ie < is || pe < ps) return;
int root = postOrder[pe];
int rIdx = index[root];
sb.append(root).append(" ");
int len = rIdx - is;
solve(is, rIdx - 1, ps, ps + len - 1);
solve(rIdx + 1, ie, ps + len, pe - 1);
}
}
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b4803. ํธ๋ฆฌ (0) | 2025.04.28 |
---|---|
b11780. ํ๋ก์ด๋ 2 (0) | 2025.04.25 |
b13913. ์๊ฐ์ด๋ 4 (0) | 2025.04.22 |
b2618. ๊ฒฝ์ฐฐ์ฐจ (0) | 2025.04.18 |
b14003. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 5 (0) | 2025.04.16 |