[SWEA] #1231 - 중위순회
2022. 3. 15. 00:11
728x90
반응형
💡 출처
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV140YnqAIECFAYD
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
💡 문제
[설명]
다음은 특정 단어(또는 문장)를 트리 형태로 구성한 것으로, in-order 형식으로 순회하여 각 노드를 읽으면 원래 단어를 알 수 있다고 한다.

위 트리를 in-order 형식으로 순회할 경우 SOFTWARE라는 단어를 읽을 수 있다.
[제약 사항]
총노드의 개수는 100개를 넘어가지 않는다.
💡 아이디어
이 문제는 InOrder, PostOrder, PreOrder의 개념만 잘 알고 있다면 쉽게 풀 수 있다.
현재 문제에선 InOrder로 출력하라고 했으니 LVR이라고 생각할 수 있다.
그렇기 때문에 노드의 왼쪽으로 가는 코드가 첫 번째(L), 그다음에 부모 노드를 출력하는 코드가 두 번째(V),
마지막으로 노드의 오른쪽으로 가는 코드(R)를 마지막에 넣어주면 문제를 해결할 수 있다.
PostOrder의 경우 부모 노드가 가장 마지막에 나오기 때문에 LRV,
PreOrder의 경우 부모 노드가 가정 먼저 나오기 때문에 VLR이라는 것을 알 수 있고, 코드의 순서만 바꿔주면
원하는 데로 출력을 할 수 있다.
💡 소스코드
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class P_1231 {
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int TC = 1; TC <= 10; TC++) {
int T = Integer.parseInt(br.readLine());
char[] Tree = new char[T + 1];
for (int i = 1; i <= T; i++) {
StringTokenizer sz = new StringTokenizer(br.readLine());
Tree[Integer.parseInt(sz.nextToken())] = sz.nextToken().charAt(0);
}
System.out.print("#" + TC + " ");
PrintInOrder(Tree, 1);
System.out.println("");
}
br.close();
}
public static void PrintInOrder(char[] Tree, int node) {
if (Tree[node] != '0') {
if (node * 2 < Tree.length)
PrintInOrder(Tree, node * 2);
System.out.print(Tree[node]);
if (node * 2 + 1 < Tree.length)
PrintInOrder(Tree, node * 2 + 1);
}
}
}
💡 결과
728x90
반응형
'Algorithm > SW Expert Academy' 카테고리의 다른 글
[SWEA] #1233 - 사칙연산 유효성 검사 (0) | 2022.03.15 |
---|---|
[SWEA] #1232 - 사칙연산 (0) | 2022.03.15 |
[SWEA] #1226 - 미로1 (0) | 2022.03.15 |
[SWEA] #1225 - 암호생성기 (0) | 2022.03.11 |
[SWEA] #1221 - GNS (0) | 2022.03.11 |