From a9d8491eabee9d11c7c83d685b3945020c8423ec Mon Sep 17 00:00:00 2001 From: programofktw Date: Wed, 9 Jul 2025 17:59:00 +0900 Subject: [PATCH] =?UTF-8?q?[Order]=20:=20=EC=A0=84=EC=9C=84,=20=EC=A4=91?= =?UTF-8?q?=EC=9C=84,=20=ED=9B=84=EC=9C=84=20=EC=88=9C=ED=9A=8C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../algorithm/AbstractTreeAlogorithm.java | 45 +++++++++++++ src/main/java/basic/algorithm/BFS.java | 42 +----------- src/main/java/basic/algorithm/DFS.java | 42 +----------- src/main/java/basic/algorithm/Order.java | 67 +++++++++++++++++++ 4 files changed, 114 insertions(+), 82 deletions(-) create mode 100644 src/main/java/basic/algorithm/AbstractTreeAlogorithm.java create mode 100644 src/main/java/basic/algorithm/Order.java diff --git a/src/main/java/basic/algorithm/AbstractTreeAlogorithm.java b/src/main/java/basic/algorithm/AbstractTreeAlogorithm.java new file mode 100644 index 0000000..56757e5 --- /dev/null +++ b/src/main/java/basic/algorithm/AbstractTreeAlogorithm.java @@ -0,0 +1,45 @@ +package basic.algorithm; + +public class AbstractTreeAlogorithm { + + public static int[] field = {0,1,2,3,4,5,6,7,8,9,10}; + + public static void printAsBinaryTree() { + int n = field.length; + int height = (int) Math.ceil(Math.log(n + 1) / Math.log(2)); // 트리 높이 + int maxNodeWidth = getMaxWidth(field); // 가장 긴 숫자의 자리수 + int maxWidth = (int) Math.pow(2, height) * (maxNodeWidth + 2); // 총 가로 폭 (간격 포함) + + int index = 0; + + for (int level = 0; level < height; level++) { + int levelNodeCount = (int) Math.pow(2, level); + int spaceBetween = maxWidth / levelNodeCount; // 노드 사이 간격 + + // 시작 여백 + System.out.print(" ".repeat(spaceBetween / 2 - maxNodeWidth / 2)); + + for (int i = 0; i < levelNodeCount && index < n; i++) { + String formatted = String.format("%" + maxNodeWidth + "d", field[index++]); + System.out.print(formatted); + + // 간격 + if (i != levelNodeCount - 1) { + System.out.print(" ".repeat(spaceBetween - maxNodeWidth)); + } + } + + System.out.println(); + } + } + + // 숫자 중 가장 긴 자리수 계산 + private static int getMaxWidth(int[] arr) { + int maxLen = 0; + for (int num : arr) { + int len = String.valueOf(num).length(); + if (len > maxLen) maxLen = len; + } + return maxLen; + } +} diff --git a/src/main/java/basic/algorithm/BFS.java b/src/main/java/basic/algorithm/BFS.java index 68e5a00..48c3c85 100644 --- a/src/main/java/basic/algorithm/BFS.java +++ b/src/main/java/basic/algorithm/BFS.java @@ -7,47 +7,7 @@ import java.util.Queue; import java.util.StringTokenizer; -public class BFS { - public static int[] field = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}; - - public static void printAsBinaryTree() { - int n = field.length; - int height = (int) Math.ceil(Math.log(n + 1) / Math.log(2)); // 트리 높이 - int maxNodeWidth = getMaxWidth(field); // 가장 긴 숫자의 자리수 - int maxWidth = (int) Math.pow(2, height) * (maxNodeWidth + 2); // 총 가로 폭 (간격 포함) - - int index = 0; - - for (int level = 0; level < height; level++) { - int levelNodeCount = (int) Math.pow(2, level); - int spaceBetween = maxWidth / levelNodeCount; // 노드 사이 간격 - - // 시작 여백 - System.out.print(" ".repeat(spaceBetween / 2 - maxNodeWidth / 2)); - - for (int i = 0; i < levelNodeCount && index < n; i++) { - String formatted = String.format("%" + maxNodeWidth + "d", field[index++]); - System.out.print(formatted); - - // 간격 - if (i != levelNodeCount - 1) { - System.out.print(" ".repeat(spaceBetween - maxNodeWidth)); - } - } - - System.out.println(); - } - } - - // 숫자 중 가장 긴 자리수 계산 - private static int getMaxWidth(int[] arr) { - int maxLen = 0; - for (int num : arr) { - int len = String.valueOf(num).length(); - if (len > maxLen) maxLen = len; - } - return maxLen; - } +public class BFS extends AbstractTreeAlogorithm{ public static void main(String[] args){ printAsBinaryTree(); diff --git a/src/main/java/basic/algorithm/DFS.java b/src/main/java/basic/algorithm/DFS.java index f55089c..7a5a38a 100644 --- a/src/main/java/basic/algorithm/DFS.java +++ b/src/main/java/basic/algorithm/DFS.java @@ -10,47 +10,7 @@ dfs 의 경우 0 1 3 4 5 6 */ -public class DFS { - public static int[] field = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}; - - public static void printAsBinaryTree() { - int n = field.length; - int height = (int) Math.ceil(Math.log(n + 1) / Math.log(2)); // 트리 높이 - int maxNodeWidth = getMaxWidth(field); // 가장 긴 숫자의 자리수 - int maxWidth = (int) Math.pow(2, height) * (maxNodeWidth + 2); // 총 가로 폭 (간격 포함) - - int index = 0; - - for (int level = 0; level < height; level++) { - int levelNodeCount = (int) Math.pow(2, level); - int spaceBetween = maxWidth / levelNodeCount; // 노드 사이 간격 - - // 시작 여백 - System.out.print(" ".repeat(spaceBetween / 2 - maxNodeWidth / 2)); - - for (int i = 0; i < levelNodeCount && index < n; i++) { - String formatted = String.format("%" + maxNodeWidth + "d", field[index++]); - System.out.print(formatted); - - // 간격 - if (i != levelNodeCount - 1) { - System.out.print(" ".repeat(spaceBetween - maxNodeWidth)); - } - } - - System.out.println(); - } - } - - // 숫자 중 가장 긴 자리수 계산 - private static int getMaxWidth(int[] arr) { - int maxLen = 0; - for (int num : arr) { - int len = String.valueOf(num).length(); - if (len > maxLen) maxLen = len; - } - return maxLen; - } +public class DFS extends AbstractTreeAlogorithm{ public static void main(String[] args){ printAsBinaryTree(); diff --git a/src/main/java/basic/algorithm/Order.java b/src/main/java/basic/algorithm/Order.java new file mode 100644 index 0000000..552b694 --- /dev/null +++ b/src/main/java/basic/algorithm/Order.java @@ -0,0 +1,67 @@ +package basic.algorithm; + +public class Order extends AbstractTreeAlogorithm { + + public static void main(String[] args){ + printAsBinaryTree(); + + System.out.print("preOrder : "); + preOrder(0); + System.out.print("\ninOrder : "); + inOrder(0); + System.out.print("\npostOrder : "); + postOrder(0); + } + + private static void preOrder(int index){ + + int left = index *2+1; + int right = index*2+2; + + System.out.print(field[index]+" -> "); + + if(left < field.length){ + preOrder(left); + } + if(right < field.length){ + preOrder(right); + } + + } + + + private static void inOrder(int index){ + + int left = index *2+1; + int right = index*2+2; + + if(left < field.length){ + inOrder(left); + } + + System.out.print(field[index]+" -> "); + if(right < field.length){ + inOrder(right); + } + } + + + + private static void postOrder(int index){ + + int left = index *2+1; + int right = index*2+2; + + + if(left < field.length){ + postOrder(left); + } + + if(right < field.length){ + postOrder(right); + } + + System.out.print(field[index]+" -> "); + } + +}