diff --git "a/\354\235\264\354\275\224\355\205\214/08 \353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/\355\232\250\354\234\250\354\240\201\354\235\270_\355\231\224\355\216\230_\352\265\254\354\204\261/\354\234\240\354\247\204.py" "b/\354\235\264\354\275\224\355\205\214/08 \353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/\355\232\250\354\234\250\354\240\201\354\235\270_\355\231\224\355\216\230_\352\265\254\354\204\261/\354\234\240\354\247\204.py" index 38cf036..f6aa30a 100644 --- "a/\354\235\264\354\275\224\355\205\214/08 \353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/\355\232\250\354\234\250\354\240\201\354\235\270_\355\231\224\355\216\230_\352\265\254\354\204\261/\354\234\240\354\247\204.py" +++ "b/\354\235\264\354\275\224\355\205\214/08 \353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/\355\232\250\354\234\250\354\240\201\354\235\270_\355\231\224\355\216\230_\352\265\254\354\204\261/\354\234\240\354\247\204.py" @@ -8,10 +8,12 @@ d = [10001] * (m + 1) # 1로 만들기 + 거스름돈 문제 같은데 -# d를 10001개로 설정하는게 맞나? -> 1원이 있을 때? -> 화폐 단위별 개수를 저장하는 거라서 1001개가 맞지 않을까 +# d를 10001개로 설정하는게 맞나? -> 1원이 있을 때? -> 화폐 단위별 개수를 저장하는 거라서 101개가 맞지 않을까 # d[1] = m일 듯. # 점화식은? # di = min(d[i - 1], d[m//i]) +# 단단히 틀림. +# 왜 i - k 인가... d[0] = 0 for i in range(n): for j in range(money[i], m + 1): diff --git "a/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274.py" "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274.py" index 31b07f4..7fac2d6 100644 --- "a/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274.py" +++ "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274.py" @@ -23,10 +23,12 @@ def dijkstra(start): # 시작 노드로 가는 비용 0 heapq.heappush(q, (0, start)) + # 근데 큐에 넣는 것 만으로도 distance에 저장이 되나? distance[start] = 0 while q: # q가 비어있지 않다면, # 최단 거리가 짧은 노드 꺼내기 + # 거리, 지금 노드 dist, now = heapq.heappop(q) # 이미 처리된 적 있는가? diff --git "a/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\353\257\270\353\236\230_\353\217\204\354\213\234/\354\234\240\354\247\204.py" "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\353\257\270\353\236\230_\353\217\204\354\213\234/\354\234\240\354\247\204.py" new file mode 100644 index 0000000..cf5741a --- /dev/null +++ "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\353\257\270\353\236\230_\353\217\204\354\213\234/\354\234\240\354\247\204.py" @@ -0,0 +1,28 @@ +INF = int(1e9) +n, m = map(int, input().split()) + +graph = [[INF] * (n + 1) for _ in range(n + 1)] + +# 자기 자신 0 +for a in range(1, n + 1): + for b in range(1, n + 1): + if a == b: + graph[a][b] = 0 + +for i in range(m): + a, b = map(int, input().split()) + graph[a][b] = 1 + graph[b][a] = 1 # 안썼었음 + +x, k = map(int, input().split()) + +for i in range(1, m + 1): + for a in range(1, m + 1): + for b in range(1, m + 1): + graph[a][b] = min(graph[a][b], graph[a][i] + graph[i][b]) + +distance = graph[1][k] + graph[k][x] +if distance == INF: + print(-1) +else: + print(distance) \ No newline at end of file diff --git "a/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\354\240\204\353\263\264/\354\234\240\354\247\204.py" "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\354\240\204\353\263\264/\354\234\240\354\247\204.py" index e69de29..448a899 100644 --- "a/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\354\240\204\353\263\264/\354\234\240\354\247\204.py" +++ "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\354\240\204\353\263\264/\354\234\240\354\247\204.py" @@ -0,0 +1,49 @@ +import heapq, sys +input = sys.stdin.readline +INF = int(1e9) + +n, m, c = map(int, input().split()) +graph = [[] for i in range(n + 1)] +distance = [INF] * (n + 1) + +# 간선들의 정보 입력받기 +for i in range(m): + x, y, z = map(int, input().split()) + graph[x].append((y, z)) + +# 다익스트라 +def dijkstra(start): + q = [] # 우선순위 큐 + + heapq.heappush(q, (0, start)) + # 시작지점 거리 0 + distance[start] = 0 + + while q: + dist, now = heapq.heappop(q) + + # 이미 처리했다면, + if distance[now] < dist: + continue + + # 지금 위치에서 비용계산을 하면 + for i in graph[now]: + cost = dist + i[1] + + # 다른 노드를 거치는게 더 적게 걸린다면, + if cost < distance[i[0]]: + heapq.heappush(q, (cost, i[0])) +dijkstra(c) # 다익스트라 함수 실행 + +# C와 연결된 도시 갯수 세기 +count = 0 + +# 전보가 가는 시간 측정 +# -> 총 걸리는 시간 = 가장 오래 걸리는 시간을 측정해야하는데 최댓값을 뽑아야 하나? +time = 0 +for i in distance: + if i != INF: + count += 1 + time = max(time, i) + +print(count - 1, time) # 시작노드 제외해야 해서 -1 해줘야 하는데 안함 \ No newline at end of file diff --git "a/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\355\224\214\353\241\234\354\235\264\353\223\234 \354\233\214\354\205\234.py" "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\355\224\214\353\241\234\354\235\264\353\223\234 \354\233\214\354\205\234.py" new file mode 100644 index 0000000..57e78aa --- /dev/null +++ "b/\354\235\264\354\275\224\355\205\214/09 \354\265\234\353\213\250 \352\262\275\353\241\234/\355\224\214\353\241\234\354\235\264\353\223\234 \354\233\214\354\205\234.py" @@ -0,0 +1,35 @@ +INF = int(1e9) + +# 노드개수, 간선의 개수 +n = int(input()) +m = int(input()) + +# 2차원 리스트 +graph = [[INF] * (n + 1) for _ in range(n + 1)] + +# 자기 자신 0으로 초기화 +for a in range(1, n + 1): + for b in range(1, n + 1): + if a == b: + graph[a][b] == 0 + +# 각 간선에 대한 정보 입력받기 +for _ in range(m): + # a에서 b까지 c + a, b, c = map(int, input().split()) + graph[a][b] = c + +# 플로이드 워셜 알고리즘 +for k in range(1, n + 1): + for a in range(1, n + 1): + for b in range(1, n + 1): + graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]) + +# 출력 +for a in range(1, n + 1): + for b in range(1, n + 1): + if graph[a][b] == INF: + print("INFINITY", end=" ") + else: + print(graph[a][b], end=" ") + print() \ No newline at end of file diff --git "a/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\353\217\204\354\213\234_\353\266\204\355\225\240_\352\263\204\355\232\215/\354\234\240\354\247\204.py" "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\353\217\204\354\213\234_\353\266\204\355\225\240_\352\263\204\355\232\215/\354\234\240\354\247\204.py" new file mode 100644 index 0000000..3fdabb6 --- /dev/null +++ "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\353\217\204\354\213\234_\353\266\204\355\225\240_\352\263\204\355\232\215/\354\234\240\354\247\204.py" @@ -0,0 +1,42 @@ +def find_parent(parent, x): + if parent[x] != x: + parent[x] = find_parent(parent, parent[x]) + return parent[x] + +def union_parent(parent, a, b): + a = find_parent(parent, a) + b = find_parent(parent, b) + if a < b: + parent[b] = a + else: + parent[a] = b + +n, m = map(int, input().split()) +parent = [0] * (n + 1) + +# 간선들 리스트 +edges = [] +# 최종 비용 +result = 0 + +for i in range(n + 1): + parent[i] = i + +for _ in range(m): + a, b, cost = map(int, input().split()) + edges.append((cost, a, b)) + +edges.sort() +last = 0 #가장 비용이 큰 간선 + +for edge in edges: + cost, a, b = edge + + # 사이클이 발생하지 않는 경우만 집합에 포함 + if find_parent(parent, a) != find_parent(parent, b): + union_parent(parent, a, b) + result += cost + last = cost # 오름차순 정렬해서 마지막 값이 가장 크기 때문 + +print(result - last) +# 마을을 두개로 하려고 길을 하나 끊는건가? \ No newline at end of file diff --git "a/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\353\217\204\354\213\234_\353\266\204\355\225\240_\352\263\204\355\232\215/\354\244\200\355\230\270.java" "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\353\217\204\354\213\234_\353\266\204\355\225\240_\352\263\204\355\232\215/\354\244\200\355\230\270.java" new file mode 100644 index 0000000..c0354cd --- /dev/null +++ "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\353\217\204\354\213\234_\353\266\204\355\225\240_\352\263\204\355\232\215/\354\244\200\355\230\270.java" @@ -0,0 +1,84 @@ +import java.util.*; + class Edge implements Comparable { + private int distance; + private int nodeA; + private int nodeB; + + public Edge(int distance, int nodeA, int nodeB) { + this.distance = distance; + this.nodeA = nodeA; + this.nodeB = nodeB; + } + + public int getDistance() { + return this.distance; + } + + public int getNodeA() { + return this.nodeA; + } + + public int getNodeB() { + return this.nodeB; + } + + @Override + public int compareTo(Edge other) { + if (this.distance < other.distance) { + return -1; + } + return 1; + } + } + + public class 도시_분할_계획 { + public static int N, M; + public static int[] parent = new int[100001]; + public static ArrayList edges = new ArrayList<>(); + public static int result = 0; + + public static int findParent(int x) { + if (x == parent[x]) return x; + return parent[x] = findParent(parent[x]); + } + + public static void unionParent(int a, int b) { + a = findParent(a); + b = findParent(b); + if (a < b) parent[b] = a; + else parent[a] = b; + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + N = scanner.nextInt(); + M = scanner.nextInt(); + + for (int i = 0; i <= N; i++) { + parent[i] = i; + } + + for (int i = 0; i < M; i++) { + int a = scanner.nextInt(); + int b = scanner.nextInt(); + int cost = scanner.nextInt(); + edges.add(new Edge(cost, a, b)); + } + + Collections.sort(edges); + int max = 0; + + for (Edge edge : edges) { + int cost = edge.getDistance(); + int a = edge.getNodeA(); + int b = edge.getNodeB(); + if (findParent(a) != findParent(b)) { + unionParent(a, b); + result += cost; + max = cost; + } + } + System.out.println(result - max); +// 한 마을의 임의의 두 집을 이은 길이 없는 경우인데 ? + } +} diff --git "a/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\355\214\200_\352\262\260\354\204\261/\354\234\240\354\247\204.py" "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\355\214\200_\352\262\260\354\204\261/\354\234\240\354\247\204.py" new file mode 100644 index 0000000..21ab2f2 --- /dev/null +++ "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\355\214\200_\352\262\260\354\204\261/\354\234\240\354\247\204.py" @@ -0,0 +1,28 @@ +def find_parent(parent, x): + if parent[x] != x: + return find_parent(parent, parent[x]) + return parent[x] + +def union_parent(parent, a, b): + a = find_parent(parent, a) + b = find_parent(parent, b) + if a < b: + parent[b] = a + else: + parent[a] = b + +n, m = map(int, input().split()) +parent = [0] * (n + 1) + +for i in range(1, n + 1): + parent[i] = i + +for i in range(m): + x, a, b = map(int, input().split()) + if x == 0: + union_parent(parent, a, b) + else: + if find_parent(parent, a) == find_parent(parent, b): + print("YES") + else: + print("NO") \ No newline at end of file diff --git "a/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\355\214\200_\352\262\260\354\204\261/\354\244\200\355\230\270.java" "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\355\214\200_\352\262\260\354\204\261/\354\244\200\355\230\270.java" new file mode 100644 index 0000000..26e80ad --- /dev/null +++ "b/\354\235\264\354\275\224\355\205\214/10 \352\267\270\353\236\230\355\224\204 \354\235\264\353\241\240/\355\214\200_\352\262\260\354\204\261/\354\244\200\355\230\270.java" @@ -0,0 +1,49 @@ +import java.util.*; + +public class 준호 { + public static int N ,M; + public static int[] parent = new int[100001]; + + public static int findParent(int x) { + if(parent[x] == x) return x; + return parent[x] = findParent(parent[x]); + } + + public static void unionParent(int a, int b) { + a = findParent(a); + b = findParent(b); + if (a > b) { + parent[a] = b; + } else { + parent[b] = a; + } + } + + public static void main(String[] args) { + + Scanner scanner = new Scanner(System.in); + N = scanner.nextInt(); + M = scanner.nextInt(); + + for (int i = 0; i <= N; i++) { + parent[i] = i; + } + + StringBuilder result = new StringBuilder(); + for (int i = 0; i < M; i++) { + int a = scanner.nextInt(); + int b = scanner.nextInt(); + int c = scanner.nextInt(); + if (a == 1) { + if (findParent(b) == findParent(c)) { + result.append("YES "); + } else { + result.append("NO "); + } + } else { + unionParent(b, c); + } + } + System.out.println(result); + } +}