Skip to content

Commit

Permalink
๐Ÿ”€merge: [Week22~23] MST 3๋ฌธ์ œ + Simulation 2๋ฌธ์ œ (#85)
Browse files Browse the repository at this point in the history
* โœจfeat: MST ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด

* โœจfeat: ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด
  • Loading branch information
jinny-l committed Aug 6, 2023
1 parent 7f9affc commit 0bf4297
Show file tree
Hide file tree
Showing 5 changed files with 420 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package week_22;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class BOJ_1197_์ตœ์†Œ_์ŠคํŒจ๋‹_ํŠธ๋ฆฌ {

private static int[] parents;

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");

// ์ž…๋ ฅ
int vertexCnt = Integer.parseInt(st.nextToken());
int edgeCnt = Integer.parseInt(st.nextToken());

Vertex[] trees = new Vertex[edgeCnt];
for (int i = 0; i < edgeCnt; i++) {
st = new StringTokenizer(br.readLine(), " ");
Vertex vertex = new Vertex();
vertex.start = Integer.parseInt(st.nextToken());
vertex.end = Integer.parseInt(st.nextToken());
vertex.cost = Integer.parseInt(st.nextToken());
trees[i] = vertex;
}

// ๊ฐ€์ค‘์น˜ ๊ธฐ์ค€ ์ •๋ ฌ
Arrays.sort(trees, (Comparator.comparingLong(o -> o.cost)));

// ๋ถ€๋ชจ ๋…ธ๋“œ ์ดˆ๊ธฐํ™”
parents = new int[vertexCnt + 1];
for (int i = 0; i <= vertexCnt; i++) {
parents[i] = i;
}

// ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
int sum = 0;
for (int i = 0; i < edgeCnt; i++) {
Vertex vertex = trees[i];
int start = vertex.start;
int end = vertex.end;

if (!sameParent(start, end)) { // ์‚ฌ์ดํด์ด ํ˜•์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด
union(start, end); // ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ณ 
sum += vertex.cost; // ๊ฐ€์ค‘์น˜ ๋”ํ•ด์ฃผ๊ธฐ
}
}

System.out.println(sum);
}

static class Vertex {
int start;
int end;
long cost;
}

private static void union(int a, int b) {
if (find(a) > find(b)) {
parents[find(a)] = find(b);
} else {
parents[find(b)] = find(a);
}
}

private static int find(int a) {
if (parents[a] == a) {
return a;
}
return parents[a] = find(parents[a]); // ???
}

private static boolean sameParent(int x, int y) {
return find(x) == find(y);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package week_22;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class BOJ_1922_๋„คํŠธ์›Œํฌ_์—ฐ๊ฒฐ {

private static int[] parents;

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

// ์ž…๋ ฅ
int vertexCnt = Integer.parseInt(br.readLine());
int edgeCnt = Integer.parseInt(br.readLine());

Vertex[] trees = new Vertex[edgeCnt];
for (int i = 0; i < edgeCnt; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
Vertex vertex = new Vertex();

vertex.start = Integer.parseInt(st.nextToken());
vertex.end = Integer.parseInt(st.nextToken());
vertex.cost = Integer.parseInt(st.nextToken());

trees[i] = vertex;
}
// ์ •๋ ฌ
Arrays.sort(trees, Comparator.comparingInt(o -> o.cost));

// ๋ถ€๋ชจ ๋…ธ๋“œ ์ดˆ๊ธฐํ™”
parents = new int[vertexCnt + 1];
for (int i = 0; i <= vertexCnt; i++) {
parents[i] = i;
}

// ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
int cost = 0;
for (int i = 0; i < edgeCnt; i++) {
Vertex vertex = trees[i];
int start = vertex.start;
int end = vertex.end;

if (!sameParent(start, end)) {
union(start, end);
cost += vertex.cost;
}
}
System.out.println(cost);
}

static class Vertex {
int start;
int end;
int cost;
}

private static boolean sameParent(int x, int y) {
return find(x) == find(y);
}

private static int find(int vertex) {
if (parents[vertex] == vertex) { // ์—ฌ๊ธฐ๋„ ์™œ ์ž๊ธฐ ์ž์‹ ์ผ ๋–„๋Š” ๊ทธ๋ƒฅ ๋Œ์•„๊ฐ€๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Œ
return vertex;
}
return parents[vertex] = find(parents[vertex]); // ์—ฌ๊ธฐ ์ดํ•ด ๋ชปํ•จ
}

private static void union(int x, int y) {
int xParent = find(x);
int yParent = find(y);

if (xParent > yParent) {
parents[x] = yParent; // ์—ฌ๊ธฐ ์ž˜๋ชป๋จ
} else {
parents[y] = xParent;
}
}

}
93 changes: 93 additions & 0 deletions jinny-l/week_22/BOJ_21924_๋„์‹œ_๊ฑด์„ค.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package week_22;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

// TODO: ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š๋Š” ์ : union find ํ•˜๋ฉด์„œ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๋‹ค ๋˜‘๊ฐ™์ด ๋ณ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ๊ฐ€? ์™œ 2๋ฒˆ ์˜ˆ์ €๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅด์ง€????
// TODO: ์ด์ƒํ•œ ์ž…๋ ฅ ์กฐ๊ฑด ๋จธ๋ƒ ์ €๊ฑฐ,, ใ…Ž

public class BOJ_21924_๋„์‹œ_๊ฑด์„ค {

private static int[] parents;

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");

// ์ž…๋ ฅ
int vertexCnt = Integer.parseInt(st.nextToken());
int edgeCnt = Integer.parseInt(st.nextToken());

long totalCost = 0;
Vertex[] trees = new Vertex[edgeCnt];
for (int i = 0; i < edgeCnt; i++) {
st = new StringTokenizer(br.readLine(), " ");
Vertex vertex = new Vertex();

vertex.start = Integer.parseInt(st.nextToken());
vertex.end = Integer.parseInt(st.nextToken());
vertex.cost = Integer.parseInt(st.nextToken());

trees[i] = vertex;
totalCost += vertex.cost;
}

// ๊ฐ€์ค‘์น˜ ๊ธฐ์ค€ ์ •๋ ฌ
Arrays.sort(trees, (Comparator.comparingInt(o -> o.cost)));

// ๋ถ€๋ชจ ๋…ธ๋“œ ์ดˆ๊ธฐํ™”
parents = new int[vertexCnt + 1];
for (int i = 0; i <= vertexCnt; i++) {
parents[i] = i;
}

// ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
long minCost = 0;
int unionCnt = 0;
for (int i = 0; i < edgeCnt; i++) {
Vertex vertex = trees[i];
int start = vertex.start;
int end = vertex.end;

if (!sameParent(start, end)) {
union(start, end);
minCost += vertex.cost;
unionCnt++;
}
}
if (unionCnt != vertexCnt - 1) {
System.out.println(-1);
return;
}
System.out.println(totalCost - minCost);
}

static class Vertex {
int start;
int end;
int cost;
}

private static void union(int a, int b) {
if (find(a) > find(b)) {
parents[find(a)] = find(b);
} else {
parents[find(b)] = find(a);
}
}

private static int find(int a) {
if (parents[a] == a) {
return a;
}
return parents[a] = find(parents[a]); // ์ด๋Ÿฐ ๋ฌธ๋ฒ• ์ฒ˜์Œ๋ด„,,
}

private static boolean sameParent(int x, int y) {
return find(x) == find(y);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package week_23;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;

public class BOJ_1713_ํ›„๋ณด_์ถ”์ฒœํ•˜๊ธฐ {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

// ์ž…๋ ฅ
int postSize = Integer.parseInt(br.readLine());
int votes = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), " ");

// ์ตœ์ข… ํ›„๋ณด ํ™•์ธ
Student[] students = new Student[101]; // ๋ชจ๋“  ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
List<Student> post = new ArrayList<>(); // ์‚ฌ์ง„ํ‹€์— ๊ฒŒ์‹œ๋œ ์ตœ์ข… ํ›„๋ณด์˜ ํ•™์ƒ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด

for (int i = 0; i < votes; i++) {
int vote = Integer.parseInt(st.nextToken());

if (students[vote] == null) { // ์ฒ˜์Œ ์ถ”์ฒœ๋ฐ›์•˜๋‹ค๋ฉด ๊ฐ์ฒด ์ƒ์„ฑ
students[vote] = new Student(vote, 0, 0, false);
}

if (students[vote].isPosted) { // ์ด๋ฏธ ๊ฒŒ์‹œ๋˜์–ด ์žˆ์œผ๋ฉด ์ถ”์ฒœ์ˆ˜๋งŒ 1์ฆ๊ฐ€
students[vote].count++; // 4๋ฒˆ ์กฐ๊ฑด ์ฃผ์˜
continue;
}

if (post.size() < postSize) { // ์‚ฌ์ง„ํ‹€์ด ๋น„์–ด์žˆ์œผ๋ฉด
post.add(students[vote]); // ๊ฒŒ์‹œํ•˜๊ณ 

} else { // ์‚ฌ์ง„๋“ค์ด ์ฐจ์žˆ์œผ๋ฉด
Collections.sort(post); // ์ถ”์ฒœ์ˆœ, ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ 
post.get(0).isPosted = false; // ๊ฒŒ์‹œ ์—ฌ๋ถ€ ์ •๋ณด ๋ฐ”๊พธ๊ณ 
post.get(0).count = 0; // ์ถ”์ฒœ ์ˆ˜ 0์œผ๋กœ ๋ณ€๊ฒฝ
post.remove(0); // ๊ธฐ์กด ํ•™์ƒ ์ œ๊ฑฐํ•˜๊ณ 
post.add(students[vote]); // ์ƒˆ๋กœ์šด ํ•™์ƒ ๊ฒŒ์‹œ
}

// ์ถ”์ฒœ๋œ ํ•™์ƒ ์ •๋ณด ์—…๋ฐ์ดํŠธ
students[vote].count++; // ์ถ”์ฒœ์ˆ˜ 1 ์ฆ๊ฐ€ํ•˜๊ณ 
students[vote].time = i; // ํฌ์ŠคํŒ… ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธํ•˜๊ณ 
students[vote].isPosted = true; // ํฌ์ŠคํŒ… ์—ฌ๋ถ€ ์—…๋ฐ์ดํŠธ
}

// ์ถœ๋ ฅ
post.sort(Comparator.comparingInt(o -> o.index));
post.forEach(student -> System.out.print(student.index + " "));
}

static class Student implements Comparable<Student> {
int index;
int count;
int time;
boolean isPosted;

public Student(int index, int count, int time, boolean isPosted) {
this.index = index;
this.count = count;
this.time = time;
this.isPosted = isPosted;
}

@Override
public int compareTo(Student o) {
if (this.count == o.count) {
return this.time - o.time;
}
return this.count - o.count;
}
}
}
Loading

0 comments on commit 0bf4297

Please sign in to comment.