๋ฐ์ํ
๋ฌธ์ (Gold 1)
https://www.acmicpc.net/problem/2233
2233๋ฒ: ์ฌ๊ณผ๋๋ฌด
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 2,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ๋ฒ๋ ๊ฐ ๋ง๋๋ 2×N์๋ฆฌ์ ์ด์ง์๊ฐ ์ฃผ์ด์ง๋ค. ์ ์งธ ์ค์๋ ์ฉ์ ์ฌ๊ณผ์ ์์น๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ X, Y๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ 2×N์๋ฆฌ
www.acmicpc.net
ํ์ด
ํธ๋ฆฌ๋ ์ด๋ ต๋ค!!!!!!!!!!!!!!!!!
์ ์ฒด ๋ก์ง
1. parent ๋ฐฐ์ด๊ณผ root ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
- Stack์ ์ด์ฉํ์ฌ ํธ๋ฆฌ ๋ง๋ค๊ธฐ
- ์ด์ง ๋ฐฐ์ด์ ๋น๊ตํ๋ฉฐ ์ญ์ ํ๊ณ ์ ํ๋ ๋ ธ๋์ '์ค์ ์ธ๋ฑ์ค' ๊ตฌํ๊ธฐ
2. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์ ๊ตฌํ๊ธฐ
- parent๋ฐฐ์ด์ ์ฌ์ฉํ ์ฌ๊ท
- ๊ธฐ์ ์กฐ๊ฑด: ๋ฃจํธ๊น์ง ์์ ๊ฒฝ์ฐ or ๋ค๋ฅธ ๋ ธ๋๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธ ํ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ
- ๋ก์ง: ํ์ฌ ๋ ธ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ, ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฌ๊ท์ ํ์
3. root ๋ฐฐ์ด๊ณผ ์ด์ง ๋ฐฐ์ด์ ๋น๊ตํ๋ฉฐ ์ค์ ์ถ๋ ฅํด์ผ ํ๋ ๊ฐ(= ํ์ฌ ๋ ธ๋๊ฐ ์ด์ง๋ฐฐ์ด ๋ช๋ฒ์งธ์์ ๋ํ๋๋์ง) ๊ตฌํ๊ธฐ
์ฝ๋
๋๋ณด๊ธฐ
package tree;
import java.io.*;
import java.util.*;
public class Main_2233_์ฌ๊ณผ๋๋ฌด {
static int remove;
static boolean[] visited;
static int[] parent;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String tree = br.readLine();
StringTokenizer st = new StringTokenizer(br.readLine());
int X = Integer.parseInt(st.nextToken());
int Y = Integer.parseInt(st.nextToken());
int[] root = new int[2*N+1]; // ์ด์ง ์์ด์ ๋งคํ๋๋ ๋
ธ๋ ๋ฒํธ๋ค
parent = new int[N+1]; // ๋ถ๋ชจ ๋
ธ๋ ๋ฒํธ ์ ์ฅ
visited = new boolean[N+1];
int remX = 0, remY = 0; // ์๋ผ์ผ ํ ๋
ธ๋ ๋ฒํธ
Stack<Integer> stack = new Stack<>();
int cnt = 1;
for(int i = 0 ; i < tree.length() ; i++){
int c = 0; // ํ์์ค์ธ ๋
ธ๋ ๋ฒํธ '๋'
if(tree.charAt(i) == '0'){ // ๋ถ๋ชจ -> '๋'
c = cnt ++; // ํ์์ค์ธ ๋
ธ๋ ๋ฒํธ ์ฆ๊ฐ
stack.push(c); // ์ผ๋จ '๋'๋ฅผ ์คํ์ ๋ฃ์
}
else{ // '๋' -> ๋ถ๋ชจ
c = stack.pop(); // '๋' = ๊ฐ์ฅ ์ต๊ทผ์ ์คํ์ ๋ค์ด๊ฐ ์
if(!stack.isEmpty()) parent[c] = stack.peek(); // '๋' ์ ์ ์คํ์ ์๋ ์ ๋ ๋ด ๋ถ๋ชจ
else parent[c] = c; // '๋' = ๋ด ๋ถ๋ชจ -> root
}
if(i+1 == X) remX = c;
if(i+1 == Y) remY = c;
root[i + 1] = c;
}
nearestAnc(remX,remY);
int ret0=0, ret1=0;
for(int i = 1 ; i < 2*N + 1 ; i++){
if(root[i] == remove){
if(ret0 == 0){ // ์์ง ์ฒ์ ์ ์ฅ๋ ์๋์ ๊ฒฝ์ฐ
ret0 = i;
}
else{
ret1 = i; break;
}
}
}
System.out.println(ret0+" "+ret1);
}
private static void nearestAnc(int n1, int n2) {
if(n1 == n2){
remove = n1; return;
}
if(visited[n1] && parent[n1] != n1){
remove = n1; return;
}
if(visited[n2] && parent[n2] != n2){
remove = n2; return;
}
if(parent[n1] == parent[n2]){
remove = parent[n1]; return;
}
visited[n1] = visited[n2] = true;
nearestAnc(parent[n1], parent[n2]);
}
}
๋ฐ์ํ
'๐ ์๊ณ ๋ฆฌ์ฆ > Tree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 111. MinimumDepthofBinaryTree. (ํด์, Kotlin ํ์ด) (0) | 2023.07.10 |
---|---|
[๋ฐฑ์ค] 4933๋ฒ ๋ดํด์ ์ฌ๊ณผ (Java) (0) | 2022.02.21 |