๋ฐ์ํ
    
    
    
  ๋ฌธ์  (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 | 
