Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c393535

Browse files
Merge pull request #279 from GreatAlgorithm-Study/xubin
[20주차] 배수빈
2 parents cf64aee + d7228cd commit c393535

File tree

10 files changed

+502
-0
lines changed

10 files changed

+502
-0
lines changed

‎BOJ/1000-5000번/SB_1967_2.java‎

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.*;
5+
6+
/*
7+
* 트리의 지름
8+
* - 루트로부터 가장 먼 노드(k) 찾기
9+
* - k로부터 가장 먼 노드 찾기
10+
* */
11+
public class SB_1967_2 {
12+
static int N;
13+
static List<List<Node>> adj = new ArrayList<>();
14+
static boolean[] visited;
15+
static int tmp;
16+
static int mx = -1;
17+
18+
private static void dfs(int cur, int dist) {
19+
if (dist > mx) { // 먼 노드가 업데이트 됐을때
20+
mx = dist;
21+
tmp = cur; // tmp 찾기위한 노드 업데이트
22+
}
23+
24+
visited[cur] = true;
25+
for (Node nxt : adj.get(cur)) {
26+
if (visited[nxt.idx]) continue;
27+
dfs(nxt.idx, dist+ nxt.cost);
28+
visited[nxt.idx] = true;
29+
}
30+
}
31+
public static void main(String[] args) throws IOException {
32+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
33+
StringTokenizer st;
34+
N = Integer.parseInt(br.readLine());
35+
36+
for (int i = 0; i < N + 1; i++) {
37+
adj.add(new ArrayList<>());
38+
}
39+
visited = new boolean[N + 1];
40+
41+
for (int i = 0; i < N-1; i++) {
42+
st = new StringTokenizer(br.readLine());
43+
int p = Integer.parseInt(st.nextToken());
44+
int c = Integer.parseInt(st.nextToken());
45+
int w = Integer.parseInt(st.nextToken());
46+
adj.get(p).add(new Node(c, w)); // 부모와 자식에 각각 정보 넣어줒기
47+
adj.get(c).add(new Node(p, w));
48+
}
49+
50+
dfs(1, 0);
51+
52+
visited = new boolean[N + 1];
53+
dfs(tmp, 0);
54+
55+
System.out.println(mx);
56+
}
57+
58+
static class Node{
59+
int idx, cost;
60+
61+
public Node(int idx, int cost) {
62+
this.idx = idx;
63+
this.cost = cost;
64+
}
65+
}
66+
}

‎BOJ/1000-5000번/SB_2110_2.java‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.Arrays;
5+
import java.util.StringTokenizer;
6+
7+
public class SB_2110_2 {
8+
static int N, C;
9+
static int[] arr;
10+
11+
private static boolean canDo(int k) {
12+
int cnt = 1;
13+
int pre = arr[0];
14+
for (int i = 1; i < N; i++) {
15+
if (arr[i]-pre >= k) { // 현재와 이전 집 사이 거리가 K보다 크거나 같을때 공유기 설치
16+
pre = arr[i];
17+
cnt++;
18+
}
19+
if (cnt >= C) return true;
20+
}
21+
return false;
22+
}
23+
public static void main(String[] args) throws IOException {
24+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
25+
StringTokenizer st = new StringTokenizer(br.readLine());
26+
27+
N = Integer.parseInt(st.nextToken());
28+
C = Integer.parseInt(st.nextToken());
29+
arr = new int[N];
30+
for (int i = 0; i < N; i++) {
31+
arr[i] = Integer.parseInt(br.readLine());
32+
}
33+
34+
Arrays.sort(arr);
35+
36+
int left = 1;
37+
int right = arr[N - 1] - arr[0];
38+
39+
int param = 0;
40+
while (left <= right) {
41+
int mid = (left + right) / 2; // 공유기간 간격
42+
if (canDo(mid)) { // 해당 공유기 간격으로 C개 이상 설치할 수 있으면 거리 늘리기
43+
left = mid+1;
44+
param = mid;
45+
}
46+
else right = mid-1;
47+
}
48+
49+
System.out.println(param);
50+
}
51+
}

‎BOJ/1000-5000번/SB_2805_2.java‎

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.Arrays;
5+
import java.util.StringTokenizer;
6+
7+
public class SB_2805_2 {
8+
static int N, M;
9+
static int[] tree;
10+
11+
private static boolean canGet(int idx, int h) {
12+
long cnt = 0;
13+
for (int i = idx; i < N; i++) {
14+
cnt += tree[i] - h;
15+
}
16+
return cnt >= M;
17+
}
18+
19+
private static int findIdx(int h) {
20+
int left = 0;
21+
int right = N;
22+
while (left < right) {
23+
int mid = (left + right) / 2;
24+
if (tree[mid] <= h) left = mid+1;
25+
else right = mid;
26+
}
27+
return left;
28+
}
29+
public static void main(String[] args) throws IOException {
30+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
31+
StringTokenizer st = new StringTokenizer(br.readLine());
32+
33+
N = Integer.parseInt(st.nextToken());
34+
M = Integer.parseInt(st.nextToken());
35+
36+
tree = new int[N];
37+
st = new StringTokenizer(br.readLine());
38+
for (int i = 0; i < N; i++) {
39+
tree[i] = Integer.parseInt(st.nextToken());
40+
}
41+
42+
Arrays.sort(tree);
43+
44+
int left = 0;
45+
int right = tree[N - 1];
46+
47+
while (left <= right) {
48+
int height = (left+right) / 2;
49+
int idx = findIdx(height);
50+
if (canGet(idx, height)) {
51+
left = height+1;
52+
} else right = height - 1;
53+
}
54+
55+
System.out.println(right);
56+
}
57+
}

‎BOJ/5001-10000번/SB_5021_2.java‎

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.ArrayList;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.StringTokenizer;
8+
9+
public class SB_5021_2 {
10+
static int N, M;
11+
static HashMap<String, Double> info = new HashMap<>();
12+
static HashMap<String, List<String>> parents = new HashMap<>();
13+
14+
private static double cal(String x) {
15+
if (info.containsKey(x)) return info.get(x); // 이미 계산된 값이면 재사용
16+
if (!parents.containsKey(x)) return 0.0; // 부모 정보 없으면 혈통 없음
17+
18+
List<String> pp = parents.get(x);
19+
20+
double bp1 = cal(pp.get(0));
21+
double bp2 = cal(pp.get(1));
22+
double blood = (bp1 + bp2) / 2;
23+
24+
info.put(x, blood); // 계산된 혈통 값 저장 (메모이제이션)
25+
return blood;
26+
}
27+
public static void main(String[] args) throws IOException {
28+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
29+
StringTokenizer st = new StringTokenizer(br.readLine());
30+
31+
N = Integer.parseInt(st.nextToken());
32+
M = Integer.parseInt(st.nextToken());
33+
34+
String king = br.readLine();
35+
info.put(king, 1.0); // 자기 혈통 정보
36+
37+
for (int i = 0; i < N; i++) {
38+
st = new StringTokenizer(br.readLine());
39+
String child = st.nextToken();
40+
String p1 = st.nextToken();
41+
String p2 = st.nextToken();
42+
43+
// 부모정보 구성하기
44+
if (!parents.containsKey(child)) parents.put(child, new ArrayList<>());
45+
parents.get(child).add(p1);
46+
parents.get(child).add(p2);
47+
}
48+
49+
// 만들어진 부모 정보를 바탕으로 혈통 계산
50+
for (String me : parents.keySet()) {
51+
cal(me);
52+
}
53+
54+
double mx = -1.0;
55+
String ans = "";
56+
for (int i = 0; i < M; i++) {
57+
String candi = br.readLine();
58+
double blood = info.getOrDefault(candi, 0.0);
59+
if (blood > mx) {
60+
mx = blood;
61+
ans = candi;
62+
}
63+
}
64+
System.out.println(ans);
65+
}
66+
}

‎BOJ/5001-10000번/SB_7579_2.java‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.StringTokenizer;
5+
6+
public class SB_7579_2 {
7+
static int N, M;
8+
public static void main(String[] args) throws IOException {
9+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
StringTokenizer st = new StringTokenizer(br.readLine());
11+
12+
N = Integer.parseInt(st.nextToken());
13+
M = Integer.parseInt(st.nextToken());
14+
15+
int[] mem = new int[N];
16+
int[] cost = new int[N];
17+
18+
st = new StringTokenizer(br.readLine());
19+
for (int i = 0; i < N; i++) {
20+
mem[i] = Integer.parseInt(st.nextToken());
21+
}
22+
23+
int mx = 0;
24+
st = new StringTokenizer(br.readLine());
25+
for (int i = 0; i < N; i++) {
26+
cost[i] = Integer.parseInt(st.nextToken());
27+
mx += cost[i];
28+
}
29+
30+
int[] dp = new int[mx + 1]; // dp[i] = k, i비용으로 얻을 수 있는 최대 메모리 k
31+
for (int i = 0; i < N; i++) { // i번째 앱에 대해
32+
for (int j = mx; j >= cost[i]; j--) { // 최대비용부터 i번째 앱 비활성으로 얻을 수 있는 비용까지 봤을때
33+
dp[j] = Math.max(dp[j], dp[j - cost[i]] + mem[i]); // 얻을 수 있는 비용 j는 기존 비용 or 비활성화로 얻을 수 있는 비용 중 최대값
34+
}
35+
}
36+
37+
int ans = 0;
38+
for (int i = 0; i <= mx; i++) {
39+
if (dp[i] >= M) {
40+
ans = i;
41+
break;
42+
}
43+
}
44+
45+
System.out.println(ans);
46+
}
47+
}

‎BOJ/5001-10000번/SB_9084_2.java‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.StringTokenizer;
5+
6+
public class SB_9084_2 {
7+
8+
private static int cal(int[] arr, int M) {
9+
int[] dp = new int[M + 1];
10+
dp[0] = 1;
11+
12+
for (int a : arr) {
13+
for (int i = a; i < M + 1; i++) {
14+
dp[i] += dp[i - a];
15+
}
16+
}
17+
return dp[M];
18+
}
19+
public static void main(String[] args) throws IOException {
20+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
21+
StringTokenizer st;
22+
StringBuilder sb = new StringBuilder();
23+
int T = Integer.parseInt(br.readLine());
24+
25+
while (T-- > 0) {
26+
int N = Integer.parseInt(br.readLine());
27+
int[] arr = new int[N];
28+
st = new StringTokenizer(br.readLine());
29+
for (int i = 0; i < N; i++) {
30+
arr[i] = Integer.parseInt(st.nextToken());
31+
}
32+
int M = Integer.parseInt(br.readLine());
33+
sb.append(cal(arr, M)).append('\n');
34+
}
35+
System.out.println(sb);
36+
}
37+
}

‎BOJ/5001-10000번/SB_9205_2.java‎

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.ArrayDeque;
5+
import java.util.Deque;
6+
import java.util.StringTokenizer;
7+
8+
public class SB_9205_2 {
9+
static int N;
10+
static Node home, target;
11+
static Node[] stores;
12+
13+
private static boolean bfs() {
14+
Deque<Node> que = new ArrayDeque<>();
15+
boolean[] visited = new boolean[N];
16+
que.add(home);
17+
18+
while (!que.isEmpty()) {
19+
Node cur = que.poll();
20+
if (canGo(cur.x, cur.y, target.x, target.y)) return true;
21+
for (int i = 0; i < N; i++) {
22+
Node nxt = stores[i];
23+
if (visited[i] || !canGo(cur.x, cur.y, nxt.x, nxt.y)) continue;
24+
que.add(nxt);
25+
visited[i] = true;
26+
}
27+
}
28+
return false;
29+
}
30+
31+
private static boolean canGo(int x, int y, int x2, int y2) {
32+
return Math.abs(x - x2) + Math.abs(y - y2) <= 1000;
33+
}
34+
public static void main(String[] args) throws IOException {
35+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
36+
StringTokenizer st;
37+
StringBuilder sb = new StringBuilder();
38+
39+
int T = Integer.parseInt(br.readLine());
40+
while (T-- > 0) {
41+
N = Integer.parseInt(br.readLine());
42+
stores = new Node[N];
43+
for (int i = 0; i < N + 2; i++) {
44+
st = new StringTokenizer(br.readLine());
45+
int x = Integer.parseInt(st.nextToken());
46+
int y = Integer.parseInt(st.nextToken());
47+
if (i==0) home = new Node(x, y);
48+
else if (i==N+1) target = new Node(x, y);
49+
else stores[i - 1] = new Node(x, y);
50+
}
51+
52+
if (bfs()) sb.append("happy").append('\n');
53+
else sb.append("sad").append('\n');
54+
}
55+
System.out.println(sb);
56+
}
57+
static class Node{
58+
int x, y;
59+
60+
public Node(int x, int y) {
61+
this.x = x;
62+
this.y = y;
63+
}
64+
}
65+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /