5639번: 이진 검색 트리
트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다
www.acmicpc.net
0. bufferedreader로 EOF 입력받는법 : null인지 아닌지 체크하기
1. 모든 수를 입력받아서 list로 저장
2. 전위순회의 결과물이므로 [루트] [왼쪽 서브트리] [오른쪽 서브트리] 의 형태로 나눌 수 있다.
3. 루트보다 커지는 지점이 오른쪽 서브트리의 시작점이므로, [왼쪽 서브트리] > [오른쪽 서브트리] > [루트] 의 순서로 재귀를 실행한다
4. 인자로 받은 서브트리가 1칸짜리면 그 원소를 list에 넣고 반환한다
- 루트는 1칸짜리라 재귀 실행 = list에 자신 저장이므로 재귀 호출 대신 직접 넣는다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main{
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
num = new ArrayList<>();
back = new ArrayList<>();
while((s=br.readLine())!=null) {
num.add(pint(s));
}
rec(0,num.size()-1);
for (int i = 0; i < back.size(); i++) {
System.out.println(back.get(i));
}
}
static ArrayList<Integer>num;
static ArrayList<Integer>back;
static void rec(int s, int e) {
if(s==e) {
back.add(num.get(s));
return;
}
int root = num.get(s);
int cnt=s+1;
while(cnt<=e && num.get(cnt)<root)cnt++;
if(s+1<=cnt-1)rec(s+1, cnt-1);
if(cnt<=e)rec(cnt,e);
back.add(root);
}
static int pint(String s) {
return Integer.parseInt(s);
}
}
'알고리즘 문제 풀이 > BOJ 실버' 카테고리의 다른 글
[백준] 17276 - 배열 돌리기 (0) | 2021.10.10 |
---|---|
[백준] 1325 - 효율적인 해킹 (0) | 2021.09.25 |
[백준] 5567 - 결혼식 (0) | 2021.08.08 |
[백준] 14241 - 슬라임 합치기 (0) | 2021.07.07 |
[백준] 1697 - 숨바꼭질 (0) | 2021.05.29 |
[백준] 2564 - 경비원 (0) | 2021.04.13 |
[백준] 2110 - 공유기 설치 (0) | 2021.04.13 |