[๋ฐฑ์ค] 4933๋ฒ ๋ดํด์ ์ฌ๊ณผ (Java)
๋ฌธ์ (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๋ก ์ค์ ํด๋์
}
}