우선 또 기뻤다. 내가 C언어로 배우는 자료구조 란 책을 사회복무요원으로 복무하면서 1년 전쯤에 독학했는데, 그때 공부한 내용을 복습없이 한번에 오로지 내 아이디어로만 구현해 내었다.
이 문제의 핵심은 알파벳이 노드를 나타내는 키로서(비유를 하자면 포인터)로서 작용되어야 하고, 각 입력값을 어떤식으로, 서로가 서로의 관계를 연결시키느냐 였다. 처음에는 각 노드의 입력마다 새로이 new 이렇게 새롭게 클래스를 만들어서 연결시켜 주고자 했는데 이러면 그냥 매번 for문에 돌때마다 새롭게 클래스가 생성될뿐 그 클래스와 다른 클래스의 관계를 표현하기엔 어려운 면이 있었다. 그래서 나는 배열에 알파벳 순서대로(유니코드를 이용한 기발한 방법) 저장하고, 배열의 인덱스와 알파벳의 1부터 26까지의 넘버를 매치시켜서 각 노드들을 연결지어줬다.
더욱 자세한 코드는 주석으로 설명했다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N=s.nextInt();
node[] arr=new node[N];
for (int i = 0; i < N; i++) {
char ch= (char) ((int)'A'+i);
//A 부터 for문의 변수 i 값이 증가할수록 유니코드 값도 증가시켜서
//N의 값에 따라 A부터 Z 까지의 값을 매치시켰다.
arr[i]=new node(String.valueOf(ch));
}
for (int i = 0; i < N; i++) {
char node=s.next().charAt(0);
char left=s.next().charAt(0);
char right=s.next().charAt(0);
if(left!='.'){
arr[node-'A'].left=arr[left-'A'];
// 내가 여기서 한 실수는 for문대로 A 부터 순차적으로
//노드가 주어지는 줄 알고, arr[i] 이렇게 해버린 것이다.
}
else{
arr[node-'A'].left=null;
}
//제일 큰 문제는 각각 어떤 배열에 저장된 클래스가 아니라
//입력받은대로 바로 클래스를 생성해서 노드와 노드를 이어주게 되면
//각 노드 사이의 관계가 의미없어진다. 즉, String 이름만 같은 연결고리가.
//만들어 지고 "이름에 따른" 연결고리는 없는것이다.
if(right!='.') {
arr[node-'A'].right = arr[right - 'A'];
// System.out.println(arr[node-'A'].name+" 노드에 오른쪽노드: "+arr[right-'A'].name +" 저장.");
}
else{
arr[node-'A'].right=null;
// System.out.println(arr[node-'A'].name+" 오른쪽노드에 null 저장.");
}
}
pre(arr[0]);
System.out.println();
mid(arr[0]);
System.out.println();
after(arr[0]);
}
static void pre(node n){
if(n==null){
return;
}
System.out.print(n.name);
pre(n.left);
pre(n.right);
}
static void mid(node n){
if(n==null){
return;
}
mid(n.left);
System.out.print(n.name);
mid(n.right);
}
static void after(node n){
if(n==null){
return;
}
after(n.left);
after(n.right);
System.out.print(n.name);
}
}
class node{
String name;
node left;
node right;
public node(node l,node r){
this.left=l;
this.right=r;
}
public node(String name){
this.name=name;
}
}
오전 공부시간 1시간
오전 순 공부시간 50분.
역시 직접 프로그래밍 하면 공부의 순도가 올라가는거 같다. 또한 재귀함수를 내가 자유자재로 쓸 정도의 실력이 되는거 같아서 기분이 너무 좋다..ㅎㅎ
'Algorithm > 백준 알고리즘 풀이' 카테고리의 다른 글
[자바] 백준 2293번 동전 1. 2021-08-06 (1) | 2021.08.06 |
---|---|
[자바] 백준 11057번 오르막 수. 2021-08-04 (0) | 2021.08.04 |
[자바] 백준 2447번 별 찍기 - 10. 2021-07-27 (0) | 2021.07.27 |
[자바] 백준 11052 카드 구매하기. 2021-07-22 (0) | 2021.07.22 |
[자바] 백준 14888번 연산자 끼워넣기. 2021-07-08 (0) | 2021.07.08 |