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
[백준] 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
--> 배열로 푼 또 다른 풀이
'알고리즘 > 그래프' 카테고리의 다른 글
[java 백준] 실버 2/ 11725번 트리의 부모 찾기 (0) | 2021.12.24 |
---|---|
[java 백준] 1991번 트리 순회 (++추가) (0) | 2021.11.09 |
[트리개념] Binary Tree와 순회방법 (0) | 2021.11.04 |
[java 백준] 골드 3/ 2146번 다리 만들기 (0) | 2021.10.13 |
[java 백준]실버 1/2178번 미로찾기 (0) | 2021.10.09 |
댓글