Skip to content

Commit 91d4202

Browse files
authored
Merge branch 'main' into lkhyun
2 parents 020e8ad + 72e4e33 commit 91d4202

File tree

43 files changed

+3723
-9
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+3723
-9
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
public class Main {
6+
7+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
static int n, d, c;
9+
static List<Info>[] graph; // 인접 리스트
10+
11+
static class Info implements Comparable<Info> {
12+
int id;
13+
int sec;
14+
public Info(int id, int sec) {
15+
this.id = id;
16+
this.sec = sec;
17+
}
18+
@Override
19+
public int compareTo(Info o) {
20+
return Integer.compare(this.sec, o.sec);
21+
}
22+
}
23+
24+
public static void main(String[] args) throws IOException {
25+
int T = Integer.parseInt(br.readLine());
26+
for (int tc = 1; tc <= T; tc++) {
27+
input();
28+
// 총 감염되는 컴퓨터 수, 마지막 컴퓨터가 감염되기까지 걸리는 시간
29+
dijkstra(c);
30+
}
31+
br.close();
32+
}
33+
34+
private static void dijkstra(int start) {
35+
PriorityQueue<Info> pq = new PriorityQueue<>();
36+
37+
int[] dist = new int[n+1];
38+
for (int i = 0; i < n+1; i++) {
39+
dist[i] = -1;
40+
}
41+
dist[start] = 0;
42+
pq.add(new Info(start, 0));
43+
44+
while (!pq.isEmpty()) {
45+
Info info = pq.poll();
46+
int current = info.id;
47+
if (dist[current] < info.sec) continue; // 이미 더 빠르게 방문한 적이 있으면 skip
48+
for (Info next : graph[current]) {
49+
if (dist[next.id] == -1 || dist[next.id] > dist[current] + next.sec ) {
50+
dist[next.id] = dist[current] + next.sec;
51+
pq.add(next);
52+
}
53+
}
54+
}
55+
56+
int cnt = 0;
57+
int time = -1;
58+
for (int i = 1; i <= n; i++) {
59+
if (dist[i] == -1) { continue; }
60+
cnt++;
61+
time = Integer.max(time, dist[i]);
62+
}
63+
// 총 감염되는 컴퓨터 수
64+
// 감염되기까지 걸리는 시간
65+
System.out.println(cnt + " " + time);
66+
}
67+
68+
private static void input() throws IOException {
69+
StringTokenizer st = new StringTokenizer(br.readLine());
70+
n = Integer.parseInt(st.nextToken());
71+
d = Integer.parseInt(st.nextToken());
72+
c = Integer.parseInt(st.nextToken());
73+
graph = new List[n+1];
74+
for (int i = 1; i < n+1; i++) {
75+
graph[i] = new ArrayList<>();
76+
}
77+
for (int i = 0; i < d; i++) {
78+
st = new StringTokenizer(br.readLine());
79+
// 컴퓨터 a가 컴퓨터 b를 의존하며, 컴퓨터 b가 감염되면 s초 후 컴퓨터 a도 감염된다.
80+
int a = Integer.parseInt(st.nextToken());
81+
int b = Integer.parseInt(st.nextToken());
82+
int s = Integer.parseInt(st.nextToken());
83+
graph[b].add(new Info(a, s));
84+
}
85+
}
86+
}
87+
88+
```
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
```java
2+
import java.io.BufferedReader;
3+
import java.io.IOException;
4+
import java.io.InputStreamReader;
5+
import java.util.*;
6+
7+
public class Main {
8+
static class Point {
9+
double r;
10+
double c;
11+
public Point (double r, double c) {
12+
this.r = r;
13+
this.c = c;
14+
}
15+
}
16+
17+
static class Edge implements Comparable<Edge>{
18+
int from;
19+
int to;
20+
double weight;
21+
public Edge(int from, int to, double weight) {
22+
this.from = from;
23+
this.to = to;
24+
this.weight = weight;
25+
}
26+
27+
@Override
28+
public int compareTo(Edge o) {
29+
return Double.compare(this.weight, o.weight);
30+
}
31+
}
32+
static int n;
33+
static int[] parents;
34+
static Point[] points;
35+
static PriorityQueue<Edge> pq;
36+
37+
38+
public static void main(String[] args) throws IOException {
39+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
40+
n = Integer.parseInt(br.readLine());
41+
points = new Point[n];
42+
for (int i = 0; i < n; i++) {
43+
StringTokenizer st = new StringTokenizer(br.readLine());
44+
double r = Double.parseDouble(st.nextToken());
45+
double c = Double.parseDouble(st.nextToken());
46+
points[i] = new Point(r, c);
47+
}
48+
// 자기 자신을 포함하는 부분집합 구성
49+
makeSet();
50+
// Point간의 거리를 계산해서 PQ에 등록
51+
pq = new PriorityQueue<>();
52+
for (int i = 0; i < n-1; i++) {
53+
for (int j = i+1; j < n; j++) {
54+
pq.offer(new Edge(i, j, getDist(points[i], points[j])));
55+
}
56+
}
57+
// ans: 별자리를 만드는 최소 비용
58+
double ans = 0.0;
59+
int edgeCnt = 0; // Kruskal 알고리즘은 간선이 n-1개 선택되면 종료
60+
while (!pq.isEmpty() && edgeCnt < n-1) {
61+
Edge e = pq.poll();
62+
if (union(e.from, e.to)) { // from, to가 서로소 집합에 속한다면 ans에 비용 추가
63+
ans += e.weight;
64+
edgeCnt++;
65+
}
66+
}
67+
System.out.printf("%.2f\n", ans);
68+
br.close();
69+
}
70+
71+
private static void makeSet() {
72+
parents = new int[n];
73+
for (int i = 0; i < n; i++) {
74+
parents[i] = i;
75+
}
76+
}
77+
78+
private static int find(int a) {
79+
if (a == parents[a]) return a;
80+
return parents[a] = find(parents[a]);
81+
}
82+
83+
private static boolean union(int a, int b) {
84+
int aRoot = find(a);
85+
int bRoot = find(b);
86+
if (aRoot == bRoot) return false;
87+
if (aRoot < bRoot) {
88+
parents[bRoot] = aRoot;
89+
} else {
90+
parents[aRoot] = bRoot;
91+
}
92+
return true;
93+
}
94+
95+
private static double getDist(Point x, Point y) {
96+
return Math.sqrt(Math.pow(x.r - y.r, 2) + Math.pow(x.c - y.c, 2));
97+
}
98+
}
99+
100+
```
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
```java
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
7+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
static int F, cnt;
9+
static Map<String, Integer> map;
10+
static int[] parents, friends;
11+
12+
public static void main(String[] args) throws IOException {
13+
int T = Integer.parseInt(br.readLine());
14+
for (int tc = 1; tc <= T; tc++) {
15+
16+
F = Integer.parseInt(br.readLine());
17+
map = new HashMap<>();
18+
cnt = 0;
19+
20+
makeSet();
21+
init();
22+
23+
for (int i = 0 ; i < F; i++) {
24+
StringTokenizer st = new StringTokenizer(br.readLine());
25+
String name1 = st.nextToken();
26+
String name2 = st.nextToken();
27+
addName(name1); // 이름 관리
28+
addName(name2);
29+
union(map.get(name1), map.get(name2));
30+
// 두 사람의 친구 네트워크에 몇 명이 있는지 구한다.
31+
int root = find(map.get(name1));
32+
System.out.println(friends[root]);
33+
}
34+
}
35+
br.close();
36+
}
37+
38+
static void addName(String name) {
39+
if (map.containsKey(name)) return;
40+
map.put(name, cnt++);
41+
}
42+
43+
static void init() {
44+
// friends[i] = i가 집합의 대표자일 때, 해당 집합에 속하는 친구들의 수
45+
friends = new int[F*2];
46+
for (int i = 0; i < F*2; i++) {
47+
friends[i] = 1; // 초기에는 자기 자신만 친구...
48+
}
49+
}
50+
51+
static void makeSet() {
52+
parents = new int[F * 2]; // F개 관계 -> 최대 F*2명의 사람 존재 가능
53+
for (int i = 0; i < F * 2; i++) {
54+
parents[i] = i;
55+
}
56+
}
57+
58+
static int find(int a) {
59+
if (a == parents[a]) return a;
60+
return parents[a] = find(parents[a]);
61+
}
62+
63+
static boolean union(int a, int b) {
64+
int aRoot = find(a);
65+
int bRoot = find(b);
66+
if (aRoot == bRoot) return false;
67+
if (aRoot < bRoot) {
68+
parents[bRoot] = aRoot;
69+
friends[aRoot] += friends[bRoot]; // 친구 수 합치깅
70+
} else {
71+
parents[aRoot] = bRoot;
72+
friends[bRoot] += friends[aRoot]; // 친구 수 합치깅
73+
}
74+
return true;
75+
}
76+
77+
78+
}
79+
80+
```
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
import java.awt.Point;
5+
public class Main {
6+
7+
static int N, M;
8+
static Point[] points;
9+
static int[] parents;
10+
static PriorityQueue<Edge> pq;
11+
12+
static class Edge implements Comparable<Edge>{
13+
int from, to;
14+
double wt;
15+
public Edge(int from, int to, double wt) {
16+
this.from = from;
17+
this.to = to;
18+
this.wt = wt;
19+
}
20+
21+
@Override
22+
public int compareTo(Edge o) {
23+
return Double.compare(this.wt, o.wt);
24+
}
25+
}
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+
N = Integer.parseInt(st.nextToken()); // 정점의 개수
31+
M = Integer.parseInt(st.nextToken()); // 이미 연결된 통로의 개수
32+
33+
points = new Point[N+1];
34+
for (int i = 1; i < N+1; i++) {
35+
st = new StringTokenizer(br.readLine());
36+
int x = Integer.parseInt(st.nextToken());
37+
int y = Integer.parseInt(st.nextToken());
38+
points[i] = new Point(x, y);
39+
}
40+
41+
makeSet();
42+
43+
for (int i = 0; i < M; i++) {
44+
// 이미 연결된 정점들에 대해 union
45+
st = new StringTokenizer(br.readLine());
46+
int a = Integer.parseInt(st.nextToken());
47+
int b = Integer.parseInt(st.nextToken());
48+
union(a, b);
49+
}
50+
51+
makePQ();
52+
double result = kruskal();
53+
System.out.printf("%.2f\n", result);
54+
br.close();
55+
}
56+
57+
static double kruskal() {
58+
double result = 0.0;
59+
while (!pq.isEmpty()) {
60+
Edge e = pq.poll();
61+
if (union(e.to, e.from)) {
62+
result += e.wt;
63+
}
64+
}
65+
return result;
66+
}
67+
68+
static void makePQ() {
69+
pq = new PriorityQueue<>();
70+
for (int i = 1; i < N; i++) {
71+
for (int j = i+1; j < N+1; j++) {
72+
pq.add(new Edge(i, j, getDist(points[i], points[j])));
73+
}
74+
}
75+
}
76+
77+
static void makeSet() {
78+
parents = new int[N+1];
79+
for (int i = 1; i < N+1; i++) {
80+
parents[i] = i;
81+
}
82+
}
83+
84+
static int find(int a) {
85+
if (parents[a] == a) return a;
86+
return parents[a] = find(parents[a]);
87+
}
88+
89+
static boolean union(int a, int b) {
90+
int aRoot = find(a);
91+
int bRoot = find(b);
92+
if (aRoot == bRoot) return false;
93+
if (aRoot < bRoot) {
94+
parents[bRoot] = aRoot;
95+
} else {
96+
parents[bRoot] = aRoot;
97+
}
98+
return true;
99+
}
100+
101+
static double getDist(Point a, Point b) {
102+
return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));
103+
}
104+
}
105+
106+
```

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@
3030
</tr>
3131

3232
<tr>
33-
<td align="center"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/khj20006/khj20006/202503">3월 제출</td>
34-
<td align="center"style="border-right : 0.5px solid gray"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/suyeun84/suyeun84/202503" >3월 제출</td>
35-
<td align="center"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/03do-new30/03do-new30/202503">3월 제출</td>
36-
<td align="center"style="border-right : 0.5px solid gray"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/ShinHeeEul/ShinHeeEul/202503">3월 제출</td>
37-
<td align="center"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/Seol-JY/Seol-JY/202503">3월 제출</td>
38-
<td align="center"style="border-right : 0.5px solid gray"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/lkhyun/lkhyun/202503">3월 제출</td>
33+
<td align="center"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/khj20006/khj20006/202505">5월 제출</td>
34+
<td align="center"style="border-right : 0.5px solid gray"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/suyeun84/suyeun84/202505" >5월 제출</td>
35+
<td align="center"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/03do-new30/03do-new30/202505">5월 제출</td>
36+
<td align="center"style="border-right : 0.5px solid gray"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/ShinHeeEul/ShinHeeEul/202505">5월 제출</td>
37+
<td align="center"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/Seol-JY/Seol-JY/202505">5월 제출</td>
38+
<td align="center"style="border-right : 0.5px solid gray"><a href="https://github.com/AlgorithmWithGod/Algorithm/new/lkhyun/lkhyun/202505">5월 제출</td>
3939
</tr>
4040
<!-- <tr>
4141
<td align = "center" colspan = "5" style="border-right : 0.5px solid gray">Full-Stack</td>

0 commit comments

Comments
 (0)