Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Members/HyunWook/Week12/BOJ15486.java
Original file line number Diff line number Diff line change
@@ -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]); // 첫째 날부터 최대 이익 출력
}
}
39 changes: 39 additions & 0 deletions Members/HyunWook/Week12/BOJ15651.java
Original file line number Diff line number Diff line change
@@ -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); // 다음 숫자 선택을 위해 재귀 호출
}
}
}
76 changes: 76 additions & 0 deletions Members/HyunWook/Week12/BOJ1967.java
Original file line number Diff line number Diff line change
@@ -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<ArrayList<Edge>> 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;
}
}
}
63 changes: 63 additions & 0 deletions Members/HyunWook/Week12/BOJ5639.java
Original file line number Diff line number Diff line change
@@ -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);
}
}