Algorithm/백준 알고리즘 풀이

[자바] 백준 1991번 트리 순회. 2021-07-30

최동훈1 2021. 7. 30. 11:44

우선 또 기뻤다. 내가 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분.

 

역시 직접 프로그래밍 하면 공부의 순도가 올라가는거 같다. 또한 재귀함수를 내가 자유자재로 쓸 정도의 실력이 되는거 같아서 기분이 너무 좋다..ㅎㅎ