본문 바로가기
알고리즘/그래프

[java 백준] 실버 1/ 1991번 트리 순회

by Meaning_ 2021. 11. 9.
728x90
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
 
public class Main2 {
    static class Node {
        int left;
        int right;
 
        public Node(int left, int right) {
            this.left = left;
            this.right = right;
        }
    }
 
    static List<Node>[] list;
    static StringBuilder sb = new StringBuilder();
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
 
        int n = Integer.parseInt(br.readLine());
        list = new ArrayList[n + 1];
        for (int i = 0; i < n; i++) {
            list[i] = new ArrayList<>();
 
        }
        for (int i = 0; i < n; i++) {
            String[] line = br.readLine().split(" ");
 
            int data = line[0].charAt(0- 'A';
            int left = line[1].charAt(0- 'A';
            int right = line[2].charAt(0- 'A';
            list[data].add(new Node(left, right));
 
        }
 
        preOrder(0);
        sb.append("\n");
        inOrder(0);
        sb.append("\n");
        pastOrder(0);
        sb.append("\n");
        System.out.println(sb.toString());
 
    }
 
    public static void preOrder(int x) {
        for (Node node : list[x]) {
            int l = node.left;
            int r = node.right;
 
            sb.append((char) (x + 'A'));
            if (l != -19)
                preOrder(l);
            if (r != -19)
                preOrder(r);
        }
    }
 
    public static void inOrder(int x) {
        for (Node node : list[x]) {
            int l = node.left;
            int r = node.right;
 
            if (l != -19)
                inOrder(l);
            sb.append((char) (x + 'A'));
            if (r != -19)
                inOrder(r);
        }
    }
 
    public static void pastOrder(int x) {
        for (Node node : list[x]) {
            int l = node.left;
            int r = node.right;
 
            if (l != -19)
                pastOrder(l);
 
            if (r != -19)
                pastOrder(r);
 
            sb.append((char) (x + 'A'));
        }
    }
 
}
 
cs

 

문제 풀이 

 

우선 나는 배열로 푸는게 더 직관적이여서 배열로 풀었다. (그릿속의 헤빗님 블로그를 참고했다)

 

Node 클래스를 만들고 , 생성자에 lefr,right 변수를 넣어준다. 이후 노드가 추가 될 때 노드의 좌우에  node.left,node.right 를 하나의 배열에 집어 넣는게 

https://we1cometomeanings.tistory.com/170?category=958599 

 

[java 백준]실버 1/2178번 미로찾기

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69..

we1cometomeanings.tistory.com

여타 다른 bfs 문제 풀이와 아이디어가 굉장히 비슷했다.(2178번도 Dote 클래스를 만들고 생성자에 x,y 정해준다. 이후 큐에 x,y 한 세트로 해서 넣어준다. )

 

List와 ArrayList의 차이 

https://yoon-dailylife.tistory.com/7

 

JAVA) List 와 ArrayList 차이

문득 List와 ArrayList의 차이점이 궁금해서 검색을 해봤습니다. List = 인터페이스 ArrayList = 클래스 List는 interface다. interface는 공통되는 메소드를 추출해 놓은 클래스로 생각하면 된다. 즉 범위로 생

yoon-dailylife.tistory.com

위 사이트에 자세히 설명되어 있는데

List 가 ArrayList보다 더 유연하다. 광범위한 느낌인 것 같다.

위 글에서 

 

List는 도형 list= new 정사각형();

ArrayList는 정사각형 ArrayList = new 정사각형();

이라는 비유를 하셨는데, 가장 직관적인 비유인 것 같다!

 

 

ArrayList<Node>[]list=new ArrayList[n+1];

 

이렇게 하면 ArrayList에서 할 수 없었던 list[i]=i; 이런식의 선언이 가능하다.

근데 ArrayList에 대괄호가 오는 건 처음봤고, 배열(array)처럼 크기도 제한적으로 설정할 수 있었다.

뿐만아니라 Node [] list= new [n+1] 도 아니고 ArrayList<Node>[]list=new ArrayList[n+1] 이라는게 그냥

신기했다. ArrayList 랑 대괄호가 오는게 타입설정하는 부분 <> 도 아니고 그 뒤에 온다는게 신기해서 스택 오버플로우를 찾아봤다. 보통 <> 안에 [] 가 들어가는 경우는 arraylist안에 array를 넣는 경우인데, 내가 찾고 있는 건 array 안에 arraylist에 해당했다.. ㅜ 열심히 이유를 찾고 있는데, 만약 찾으면 다시 이곳에 적으러 오겠다!

 

 

우선 이 코드를 사용하면

 

1. ArrayList가 아닌 배열 인덱스를 사용해서 배열안에 객체를 넣을 수 있고

2. ArrayList에 크기를 설정할 수 있으며, 배열처럼 사용할 수 있다. 이러면 걍 Node []list=new Node[n+1]; 을 하지 그랬느냐? 하겠지만

 

나중에 전위,중위,후위 순회 메서드를 만들 때

 

for(Node node:list[x]{

} 를 꼭 돌려줘야 하기 때문에 어쩔 수 없다. 

이걸 array로 하게되면 iterable하지 않다고 에러가 뜬다. 그래서 iterable한 List를 쓸 수 밖에..ㅜ

https://girawhale.tistory.com/17

 

[Java] Iterable과 Iterator

자료구조를 공부하던 중 Iterable과 Iterator가 나왔다. Iterator는 알고 있었지만 Iterable은 알지 못했기 때문에 정리해보았다. Java 내부의 코드를 살펴보면, List , Set , Queue ⇒ Collection ⇒ Iterable..

girawhale.tistory.com

 

 

 

 

참고 사이트

 

 

https://minhamina.tistory.com/80

 

[Java] 트리(tree) 구현 - 1차원 배열 / 2차원 배열 / 클래스 3가지 방법 구현

1. 트리 1차원 배열로 구현 주로 포화 이진 트리나 완전 이진트리의 경우 많이 쓰이는 방법이다. 그외의 이진트리도 저장이 불가능한 것은 아니지만 기억공간의 낭비가 심해진다. 따라서 포화 이

minhamina.tistory.com

https://loosie.tistory.com/344

 

[BOJ] 백준 1991번 트리 순회 (Java)

#1991 트리 순회 난이도 : 실버 1 유형 : 트리 1991번: 트리 순회 첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽

loosie.tistory.com

 

 

이밖에도 다른 풀이

 

https://minhamina.tistory.com/78

 

[백준 - Java] 1991번 : 트리 순회

문제 www.acmicpc.net/problem/1991 1991번: 트리 순회 첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어

minhamina.tistory.com

https://velog.io/@jini_eun/%EB%B0%B1%EC%A4%80-1991%EB%B2%88-%ED%8A%B8%EB%A6%AC-%EC%88%9C%ED%9A%8C-Java-Python

 

[백준] 1991번 트리 순회 / Java, Python

대표적인 그래프 종류 중 하나인 트리를 다뤄 봅시다.Java / Python1991번 이진 트리에 대해 알아보고, 이진 트리를 순회해 봅시다.이번 문제는 이진 트리를 입력받아 전위 순회(preorder traversal), 중위

velog.io

 

--> 처음엔 Node 형 변수 만들어서 풀었는데 나중에 형변환 하는 것 땜에 골머리를 앓아서 이렇게 풀진 않았다 (아마 내가 잘못 풀었을 거다)  이 풀이도 언젠가 유용해질 시점이 올 것 같은 느낌이 들기에 첨부해뒀다.

 

https://dos-soles.tistory.com/15

 

[BOJ] 1991 트리 순회 - Java

[문제] 이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오. 예를 들어 위와 같은 이진 트리가 입..

dos-soles.tistory.com

--> 배열로 푼 또 다른 풀이 

728x90
반응형

댓글