베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 9934번: 완전 이진 트리

2022. 11. 14. 20:44

https://www.acmicpc.net/problem/9934

 

9934번: 완전 이진 트리

상근이는 슬로베니아의 도시 Donji Andrijevci를 여행하고 있다. 이 도시의 도로는 깊이가 K인 완전 이진 트리를 이루고 있다. 깊이가 K인 완전 이진 트리는 총 2K-1개의 노드로 이루어져 있다. (아래

www.acmicpc.net

키워드

  1. 가장 처음에 상근이는 트리의 루트에 있는 빌딩 앞에 서있다.
  2. 현재 빌딩의 왼쪽 자식에 있는 빌딩에 아직 들어가지 않았다면, 왼쪽 자식으로 이동한다.
  3. 현재 있는 노드가 왼쪽 자식을 가지고 있지 않거나 왼쪽 자식에 있는 빌딩을 이미 들어갔다면, 현재 노드에 있는 빌딩을 들어가고 종이에 번호를 적는다.
  4. 현재 빌딩을 이미 들어갔다 온 상태이고, 오른쪽 자식을 가지고 있는 경우에는 오른쪽 자식으로 이동한다.
  5. 현재 빌딩과 왼쪽, 오른쪽 자식에 있는 빌딩을 모두 방문했다면, 부모 노드로 이동한다.

총 K개의 줄에 걸쳐서 정답을 출력한다. i번째 줄에는 레벨이 i인 빌딩의 번호를 출력한다.


구현

완전 이진트리임을 이용한다. → 주어지는 번호는 포화이진트리만큼 주어지므로 이를 배열의 인덱스로 이용한다.

위 이동 순서대로 해당 노드에 번호를 부여한다.

출력의 경우는

1줄에 1개

2줄에 2개

3줄에 4개

…

k 줄에 2^(k-1) 개를 출력한다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class java_9934 {
    static int K;
    static int tree[];
    static Deque<Integer> queue;
    static boolean isVisited[];

    public static void trap(int thisNode) {
        if (thisNode == 0) {
            return;
        }
        // 현재 빌딩과 왼쪽, 오른쪽 자식에 있는 빌딩을 모두 방문 했다면..
        if (thisNode * 2 >= tree.length || tree[thisNode * 2] != 0) {
            if (thisNode * 2 + 1 >= tree.length || tree[thisNode * 2 + 1] != 0) {
                if (tree[thisNode] != 0) {
                    trap(thisNode / 2);
                }
            }
        }

        // 왼쪽 자식의 빌딩에 들어가지 않았다면 왼쪽 자식으로 이동
        try {
            if (tree[thisNode * 2] == 0) {
                trap(thisNode * 2);
            }
        } catch (ArrayIndexOutOfBoundsException e) {

        }

        // 왼쪽 자식을 갖고 있지 않거나, 왼쪽 자식에 있는 빌딩을 이미 들어갔다면, 현재 노드에 있는 빌딩 들어가기
        if (thisNode * 2 >= tree.length || tree[thisNode * 2] != 0) {
            tree[thisNode] = queue.poll();
        }

        // 현재 빌딩을 이미 갔다 온 상태이고, 오른쪽 자식을 가지는 경우 -> 오른쪽 자식으로 이동
        if (tree[thisNode] != 0) {
            if (thisNode * 2 + 1 < tree.length) {
                trap(thisNode * 2 + 1);
            }
        }

    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 깊이가 K인 완전 이진 트리 -> 포화 이진 트리
        // 2^K-1 개의 노드 -> 1차원 배열 사용
        K = Integer.parseInt(br.readLine());

        tree = new int[(int) Math.pow(2, K)];

        queue = new ArrayDeque<>();
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < tree.length - 1; i++) {
            queue.add(Integer.parseInt(st.nextToken()));
        }

        trap(1);

        int targetCount = 0;
        int count = 0;
        for (int i = 1; i < tree.length; i++) {
            System.out.print(tree[i] + " ");
            count++;
            if (count == Math.pow(2, targetCount)) {
                System.out.println();
                targetCount++;
                count = 0;
            }
        }

        br.close();
    }
}

저작자표시 (새창열림)

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAAVA] 1967번: 트리의 지름  (0) 2022.11.14
[BOJ/JAVA] 15681번: 트리와 쿼리  (1) 2022.11.14
[BOJ/JAVA] 11725번: 트리의 부모 찾기  (0) 2022.11.14
[BOJ/JAVA] 11559번: Puyo Puyo  (0) 2022.11.07
[BOJ/JAVA] 20055 컨베이어 벨트 위의 로봇  (0) 2022.11.07
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAAVA] 1967번: 트리의 지름
    • [BOJ/JAVA] 15681번: 트리와 쿼리
    • [BOJ/JAVA] 11725번: 트리의 부모 찾기
    • [BOJ/JAVA] 11559번: Puyo Puyo
    베오
    베오

    티스토리툴바