๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Tree

[๋ฐฑ์ค€] 4933๋ฒˆ ๋‰ดํ„ด์˜ ์‚ฌ๊ณผ (Java)

์ ์ด 2022. 2. 21. 22:23
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ (Gold 3)

https://www.acmicpc.net/problem/4933

 

4933๋ฒˆ: ๋‰ดํ„ด์˜ ์‚ฌ๊ณผ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ, ๋‘ ํŠธ๋ฆฌ๊ฐ€ ๋™๋“ฑํ•˜๋ฉด true๋ฅผ, ์•„๋‹ˆ๋ฉด false๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net


ํ’€์ด

์ž…๋ ฅ ๋ฐ›์€ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ํŠธ๋ฆฌ๋กœ ๋งŒ๋“œ๋Š๋ƒ๋ฅผ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ฑด.

์ž…๋ ฅ์€ ํฌ์ŠคํŠธ์˜ค๋”(ํ›„์œ„์ˆœํšŒ)๋กœ ์ฃผ์–ด์ง„๋‹ค๊ณ  ํ•˜๋‹ˆ stack์„ ํ™œ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๊ตฌ์„ฑ

 

ํ›„์œ„์ˆœํšŒ๋กœ ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„์˜ stack ๋ณ€ํ™˜ ๋กœ์ง

1. ํ˜„์žฌ ๋„ฃ์œผ๋ ค๋Š” ๋…ธ๋“œ(i)๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , ์ด๋ฏธ ์Šคํƒ์— 2๊ฐœ ์ด์ƒ ์Œ“์—ฌ์žˆ๋‹ค๋ฉด

2. ๋งจ ๋‚˜์ค‘์— ๋„ฃ์€ ๋…ธ๋“œ(stack.pop())๊ฐ€ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ 

3. ๊ทธ ์ „์— ๋„ฃ์€ ๋…ธ๋“œ(stack.pop())๊ฐ€ ์™ผ์ชฝ ๋…ธ๋“œ

4. right์™€ left๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ํ˜„์žฌ ๋…ธ๋“œ(i)๋กœ ์„ค์ •

5. ํ˜„์žฌ ๋…ธ๋“œ(i)๋ฅผ ๋‹ค์‹œ ์Šคํƒ์— push

6. ๋งจ ๋งˆ์ง€๋ง‰์— ๋‚จ์•„์žˆ๋Š” ๊ฐ’์ด root

 

ํŠธ๋ฆฌ ๋น„๊ต

ํŠธ๋ฆฌ๊ฐ€ ๊ฐ™๋‹ค == ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ์ €์žฅํ•ด๋†“๋Š” ๋ฐฐ์—ด(tree1, tree2)๊ฐ€ ๋ชจ๋‘ ๊ฐ™๋‹ค!

์ฝ”๋“œ

๋”๋ณด๊ธฐ
package tree;

import java.io.*;
import java.util.*;

public class Main_4933_๋‰ดํ„ด์˜์‚ฌ๊ณผ {
    static int[] tree1, tree2;  // ๊ฐ ์ธ๋ฑ์Šค์—๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์ €์žฅ
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());
        for(int tc=0 ; tc<T ; tc++){
            tree1 = new int[26+1];  // ๋…ธ๋“œ๋Š” ๋ชจ๋‘ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋ผ๊ณ  ํ–ˆ์œผ๋‹ˆ, ์ตœ๋Œ€ 26๊ฐœ์ž„
            tree2 = new int[26+1];  // 0๋ฒˆ ๋…ธ๋“œ๋Š” ์“ฐ๋ ˆ๊ธฐ ๋…ธ๋“œ๋กœ ์•„์— ์“ฐ์ง€ ์•Š์Œ (์•„๋ž˜์— ์ด์œ  ๊ธฐ์žฌ)

            makeTree(tree1, br.readLine());
            makeTree(tree2, br.readLine());

            /*
                ํŠธ๋ฆฌ๊ฐ€ ๋˜‘๊ฐ™๋‹ค == ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™๋‹ค
             */
            boolean isSame = true;
            for(int i = 1 ; i < 27 ; i++){
                if(tree1[i] != tree2[i]){
                    isSame = false;
                    break;
                }
            }
            sb.append(isSame+"\n");
        }
        System.out.println(sb.toString());
    }

    private static void makeTree(int[] tree, String str) {
        StringTokenizer st = new StringTokenizer(str);
        Stack<Integer> stack = new Stack<>();   // ์ง์„ ๋ชป์ง€์€ ๋…ธ๋“œ๋“ค์ด ๋“ค์–ด์žˆ๋Š” stack
        while(true) {
            String s = st.nextToken();
            if(s.equals("end")) break;
            int i = s.equals("nil")? 0 : s.toCharArray()[0]-'A'+1;  // ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝ 'A'->1, 'B'->2...

            if(i!=0 && stack.size() >= 2){  // ํ˜„์žฌ ๋„ฃ์œผ๋ ค๋Š” ๋…ธ๋“œ๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , ์ด๋ฏธ ์Šคํƒ์— 2๊ฐœ ์ด์ƒ ์Œ“์—ฌ์žˆ๋‹ค๋ฉด
                int right = stack.pop();    // ๋‚˜์ค‘์— ๋„ฃ์€ ๋…ธ๋“œ๊ฐ€ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ (by.ํ›„์œ„์ˆœํšŒ)
                int left = stack.pop();     // ๋จผ์ € ๋„ฃ์€ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ ๋…ธ๋“œ (by.ํ›„์œ„์ˆœํšŒ)
                tree[right] = i;    // right ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋Š” i
                tree[left] = i;     // left ๋…ธ๋“œ์ด ๋ถ€๋ชจ๋Š” i
            }
            stack.push(i);  // ๋…ธ๋“œ ๋งŒ๋“  ํ›„, ๋‹ค์‹œ ์Šคํƒ์œผ๋กœ push
        }
        int root = stack.peek();    // ๋งˆ์ง€๋ง‰ ๋‚จ์•„์žˆ๋Š” ๊ฐ’์ด root
        tree[root] = root;  // root์˜ ๋ถ€๋ชจ๋Š” root๋กœ ์„ค์ •ํ•ด๋†“์Œ
    }
}
๋ฐ˜์‘ํ˜•