From fc44116bf8fce274e814cc5a62e232c8845c229d Mon Sep 17 00:00:00 2001 From: wooki37 Date: Thu, 24 Aug 2023 00:15:17 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=9D=B4=EC=A7=84=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=ED=8A=B8=EB=A6=AC:package:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Members/HyunWook/Week12/BOJ5639.java | 63 ++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Members/HyunWook/Week12/BOJ5639.java diff --git a/Members/HyunWook/Week12/BOJ5639.java b/Members/HyunWook/Week12/BOJ5639.java new file mode 100644 index 0000000..d608487 --- /dev/null +++ b/Members/HyunWook/Week12/BOJ5639.java @@ -0,0 +1,63 @@ +// 5639 - 이진 검색 트리 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +class Node { + int data; + Node left, right; + + public Node(int data) { + this.data = data; + left = right = null; + } +} + +public class Main { + static Node root; + + // 이진 트리에 노드를 삽입하는 메소드 + static Node insert(Node node, int data) { + if (node == null) { + return new Node(data); // 노드가 비어있으면 새로운 노드 생성 + } + + if (data < node.data) { + node.left = insert(node.left, data); // 데이터가 현재 노드보다 작으면 왼쪽 서브트리에 삽입 + } else if (data > node.data) { + node.right = insert(node.right, data); // 데이터가 현재 노드보다 크면 오른쪽 서브트리에 삽입 + } + + return node; + } + + // 후위 순회 메소드 + static void postorder(Node node) { + if (node == null) { + return; // 노드가 비어있으면 리턴 + } + + postorder(node.left); // 왼쪽 서브트리 후위 순회 + postorder(node.right); // 오른쪽 서브트리 후위 순회 + System.out.println(node.data); // 현재 노드 데이터 출력 + } + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String input; + + // 루트 노드 생성 + input = br.readLine(); + root = new Node(Integer.parseInt(input)); + + // 나머지 노드 삽입 + while ((input = br.readLine()) != null && input.length() != 0) { + int data = Integer.parseInt(input); + insert(root, data); + } + + // 후위 순회 결과 출력 + postorder(root); + } +} \ No newline at end of file From 68e7a4fec0cd5ba0ddcaeebdc70a83f15d9fe3c5 Mon Sep 17 00:00:00 2001 From: wooki37 Date: Thu, 24 Aug 2023 00:15:53 +0900 Subject: [PATCH 2/4] =?UTF-8?q?N=EA=B3=BC=20M(3):package:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Members/HyunWook/Week12/BOJ15651.java | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Members/HyunWook/Week12/BOJ15651.java diff --git a/Members/HyunWook/Week12/BOJ15651.java b/Members/HyunWook/Week12/BOJ15651.java new file mode 100644 index 0000000..a9c4112 --- /dev/null +++ b/Members/HyunWook/Week12/BOJ15651.java @@ -0,0 +1,39 @@ +// 15651 - N과 M(3) + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main { + static int N, M; + static int[] selected; // 선택한 숫자를 저장할 배열 + static StringBuilder sb = new StringBuilder(); + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); // 1부터 N까지의 자연수 중에서 + M = Integer.parseInt(st.nextToken()); // 중복을 허용하여 M개를 고르는 경우 + + selected = new int[M]; // M개를 저장하는 배열 생성 + permutation(0); // 재귀적으로 순열 생성 시작 - 순열 : permutation + + System.out.println(sb.toString()); + } + + static void permutation(int depth) { + if (depth == M) { // M개를 선택한 경우 결과를 출력하고 종료 + for (int num : selected) { + sb.append(num).append(" "); // 결과에 선택한 숫자 추가 + } + sb.append('\n'); + return; + } + for (int i = 1; i <= N; i++) { // 1부터 N까지의 숫자 중에서 선택 + selected[depth] = i; // 선택한 숫자를 배열에 저장 + permutation(depth + 1); // 다음 숫자 선택을 위해 재귀 호출 + } + } +} \ No newline at end of file From 4deef6b7dafb356357a188228b1d2fec821a293b Mon Sep 17 00:00:00 2001 From: wooki37 Date: Fri, 25 Aug 2023 00:46:01 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=ED=8A=B8=EB=A6=AC=EC=9D=98=20=EC=A7=80?= =?UTF-8?q?=EB=A6=84:package:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Members/HyunWook/Week12/BOJ1967.java | 76 ++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Members/HyunWook/Week12/BOJ1967.java diff --git a/Members/HyunWook/Week12/BOJ1967.java b/Members/HyunWook/Week12/BOJ1967.java new file mode 100644 index 0000000..5fa4f2c --- /dev/null +++ b/Members/HyunWook/Week12/BOJ1967.java @@ -0,0 +1,76 @@ +// 1967 - 트리의 지름 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.StringTokenizer; + +public class Main { + static int n, maxDistance, farthestNode; + static ArrayList> tree; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + n = Integer.parseInt(br.readLine()); + + // 노드의 개수에 따라 ArrayList를 생성하여 트리 구조를 표현 + tree = new ArrayList<>(); + for (int i = 0; i <= n; i++) { + tree.add(new ArrayList<>()); + } + // n-1개의 간선 정보를 입력받아 트리 구성 + for (int i = 0; i < n - 1; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int parent = Integer.parseInt(st.nextToken()); + int child = Integer.parseInt(st.nextToken()); + int weight = Integer.parseInt(st.nextToken()); + + // 양방향 간선으로 구성 + tree.get(parent).add(new Edge(child, weight)); + tree.get(child).add(new Edge(parent, weight)); + } + maxDistance = 0; + farthestNode = 0; + + // 임의의 노드에서 가장 먼 노드 찾기 + dfs(1, 0, new boolean[n + 1]); + + maxDistance = 0; + // 가장 먼 노드에서 가장 먼 노드까지의 거리 찾기 + dfs(farthestNode, 0, new boolean[n + 1]); + + // 트리의 지름 출력 + System.out.println(maxDistance); + } + + // 깊이 우선 탐색 (Depth First Search) + static void dfs(int node, int distance, boolean[] visited) { + visited[node] = true; + + // 현재까지의 거리가 최대 거리보다 크면 업데이트 + if (distance > maxDistance) { + maxDistance = distance; + farthestNode = node; + } + // 현재 노드와 연결된 모든 노드들에 대해 재귀적으로 호출 + for (Edge edge : tree.get(node)) { + int nextNode = edge.to; + int weight = edge.weight; + if (!visited[nextNode]) { + dfs(nextNode, distance + weight, visited); + } + } + } + + // 트리의 간선을 나타내는 클래스 + static class Edge { + int to; // 간선의 도착 노드 + int weight; // 간선의 가중치 + + public Edge(int to, int weight) { + this.to = to; + this.weight = weight; + } + } +} \ No newline at end of file From 6ac59b1c867d7d23088920fd15890727dd0d9e4f Mon Sep 17 00:00:00 2001 From: wooki37 Date: Fri, 25 Aug 2023 00:46:28 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=ED=87=B4=EC=82=AC=202:package:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Members/HyunWook/Week12/BOJ15486.java | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Members/HyunWook/Week12/BOJ15486.java diff --git a/Members/HyunWook/Week12/BOJ15486.java b/Members/HyunWook/Week12/BOJ15486.java new file mode 100644 index 0000000..48b2dc7 --- /dev/null +++ b/Members/HyunWook/Week12/BOJ15486.java @@ -0,0 +1,31 @@ +// 15486 - 퇴사 2 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int[] T = new int[N + 1]; // 소요 시간 + int[] P = new int[N + 1]; // 이익 + + for (int i = 1; i <= N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + T[i] = Integer.parseInt(st.nextToken()); + P[i] = Integer.parseInt(st.nextToken()); + } + int[] dp = new int[N + 2]; // 각 날짜별 최대 이익을 저장하는 배열 + + // 뒤에서부터 최대 이익을 계산 + for (int i = N; i >= 1; i--) { + int nextDay = i + T[i]; // 해당 상담을 수행했을 때 종료되는 날짜 + // 상담을 수행하거나, 수행하지 않는 경우 중 최대 이익을 선택 + dp[i] = Math.max(dp[i + 1], nextDay <= N + 1 ? P[i] + dp[nextDay] : dp[i + 1]); + } + System.out.println(dp[1]); // 첫째 날부터 최대 이익 출력 + } +}