{"id":34866,"date":"2024-11-01T09:32:54","date_gmt":"2024-11-01T09:32:54","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=34866"},"modified":"2024-11-01T11:26:11","modified_gmt":"2024-11-01T11:26:11","slug":"swift-coding-test-course-finding-minimum-spanning-tree","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/34866\/","title":{"rendered":"Swift Coding Test Course, Finding Minimum Spanning Tree"},"content":{"rendered":"<p><body><\/p>\n<p>Today, we will take a detailed look at one of the algorithm problems that frequently appear in coding tests: finding the Minimum Spanning Tree (MST). A minimum spanning tree is a tree that includes all the vertices of a given weighted graph, while having the minimum possible sum of weights. To solve this problem, we can use Kruskal&#8217;s Algorithm and Prim&#8217;s Algorithm. This article will focus on addressing the problem using Kruskal&#8217;s Algorithm.<\/p>\n<h2>Problem Description<\/h2>\n<p><strong>Problem:<\/strong> Find the minimum spanning tree of the given graph.<\/p>\n<p>The graph provided as input is presented in the following format:<\/p>\n<pre>\n8 11\n0 1 4\n0 7 8\n1 2 8\n1 7 11\n2 3 7\n2 5 4\n2 6 2\n3 4 9\n3 5 14\n4 5 10\n5 6 2\n<\/pre>\n<p>The first line indicates the number of vertices and the number of edges, and from the second line onward, the information of the edges is provided. Here, each edge consists of two vertices and the corresponding weight. For example, &#8220;0 1 4&#8221; means that the edge connecting vertex 0 and vertex 1 has a weight of 4.<\/p>\n<h2>Problem Solving Strategy<\/h2>\n<p>To solve this problem, the following steps are necessary:<\/p>\n<ol>\n<li>Store the edge information of the graph.<\/li>\n<li>Apply Kruskal&#8217;s Algorithm to find the minimum spanning tree.<\/li>\n<li>Finally, sum up the weights of the selected edges and output the result.<\/li>\n<\/ol>\n<h3>1. Storing Edge Information of the Graph<\/h3>\n<p>First, read the input and store the edge information of the graph. For this, each edge should be stored as a tuple in the form of <code>(weight, starting vertex, ending vertex)<\/code>. Each edge should be designed to be sortable based on its weight.<\/p>\n<pre><code>\nimport Foundation\n\nstruct Edge {\n    let weight: Int\n    let start: Int\n    let end: Int\n}\n\nfunc readGraph() -> [Edge] {\n    let firstLine = readLine()!.split(separator: \" \").map { Int($0)! }\n    let vertexCount = firstLine[0]\n    let edgeCount = firstLine[1]\n    var edges = [Edge]()\n\n    for _ in 0..<edgeCount {\n        let edgeInfo = readLine()!.split(separator: \" \").map { Int($0)! }\n        edges.append(Edge(weight: edgeInfo[2], start: edgeInfo[0], end: edgeInfo[1]))\n    }\n    return edges\n}\n<\/code><\/pre>\n<h3>2. Implementing Kruskal's Algorithm<\/h3>\n<p>Kruskal's Algorithm sorts all the edges by weight, then adds them one by one from the lowest weight, ensuring that cycles are not formed. For this, a Union-Find data structure is used. The Union-Find structure allows for quick checks on whether two sets are connected and provides a method to unite two sets.<\/p>\n<pre><code>\nclass DisjointSet {\n    private var parent: [Int]\n\n    init(size: Int) {\n        self.parent = Array(0..<size)\n    }\n\n    func find(_ node: Int) -> Int {\n        if parent[node] != node {\n            parent[node] = find(parent[node])\n        }\n        return parent[node]\n    }\n\n    func union(_ a: Int, _ b: Int) {\n        let rootA = find(a)\n        let rootB = find(b)\n        if rootA != rootB {\n            parent[rootB] = rootA\n        }\n    }\n}\n\nfunc kruskal(edges: [Edge], vertexCount: Int) -> Int {\n    let sortedEdges = edges.sorted { $0.weight < $1.weight }\n    let disjointSet = DisjointSet(size: vertexCount)\n    var totalWeight = 0\n\n    for edge in sortedEdges {\n        if disjointSet.find(edge.start) != disjointSet.find(edge.end) {\n            disjointSet.union(edge.start, edge.end)\n            totalWeight += edge.weight\n        }\n    }\n\n    return totalWeight\n}\n<\/code><\/pre>\n<h3>3. Main Function<\/h3>\n<p>Now that all parts are ready, let's write the main function to execute the entire process.<\/p>\n<pre><code>\nfunc main() {\n    let edges = readGraph()\n    let totalWeight = kruskal(edges: edges, vertexCount: 8)\n    print(\"The sum of weights in the minimum spanning tree: \\(totalWeight)\")\n}\n\nmain()\n<\/code><\/pre>\n<h2>Complete Program<\/h2>\n<p>With all the steps completed, we can now write the overall program as follows:<\/p>\n<pre><code>\nimport Foundation\n\nstruct Edge {\n    let weight: Int\n    let start: Int\n    let end: Int\n}\n\nclass DisjointSet {\n    private var parent: [Int]\n\n    init(size: Int) {\n        self.parent = Array(0..<size)\n    }\n\n    func find(_ node: Int) -> Int {\n        if parent[node] != node {\n            parent[node] = find(parent[node])\n        }\n        return parent[node]\n    }\n\n    func union(_ a: Int, _ b: Int) {\n        let rootA = find(a)\n        let rootB = find(b)\n        if rootA != rootB {\n            parent[rootB] = rootA\n        }\n    }\n}\n\nfunc readGraph() -> [Edge] {\n    let firstLine = readLine()!.split(separator: \" \").map { Int($0)! }\n    let vertexCount = firstLine[0]\n    let edgeCount = firstLine[1]\n    var edges = [Edge]()\n\n    for _ in 0..<edgeCount {\n        let edgeInfo = readLine()!.split(separator: \" \").map { Int($0)! }\n        edges.append(Edge(weight: edgeInfo[2], start: edgeInfo[0], end: edgeInfo[1]))\n    }\n    return edges\n}\n\nfunc kruskal(edges: [Edge], vertexCount: Int) -> Int {\n    let sortedEdges = edges.sorted { $0.weight < $1.weight }\n    let disjointSet = DisjointSet(size: vertexCount)\n    var totalWeight = 0\n\n    for edge in sortedEdges {\n        if disjointSet.find(edge.start) != disjointSet.find(edge.end) {\n            disjointSet.union(edge.start, edge.end)\n            totalWeight += edge.weight\n        }\n    }\n    return totalWeight\n}\n\nfunc main() {\n    let edges = readGraph()\n    let totalWeight = kruskal(edges: edges, vertexCount: 8)\n    print(\"The sum of weights in the minimum spanning tree: \\(totalWeight)\")\n}\n\nmain()\n<\/code><\/pre>\n<h2>Conclusion<\/h2>\n<p>In this post, we explored how to solve the Minimum Spanning Tree problem using Swift. We learned the process of finding the MST using Kruskal's Algorithm based on edges and how to use Union-Find. When facing such problems in actual coding tests and interviews, I hope you can approach them with confidence based on your theories and algorithms. Next time, we will discuss finding the minimum spanning tree using Prim's Algorithm, so please look forward to it.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today, we will take a detailed look at one of the algorithm problems that frequently appear in coding tests: finding the Minimum Spanning Tree (MST). A minimum spanning tree is a tree that includes all the vertices of a given weighted graph, while having the minimum possible sum of weights. To solve this problem, we &hellip; <a href=\"https:\/\/atmokpo.com\/w\/34866\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Swift Coding Test Course, Finding Minimum Spanning Tree&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[129],"tags":[],"class_list":["post-34866","post","type-post","status-publish","format-standard","hentry","category-swift-coding-test"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Swift Coding Test Course, Finding Minimum Spanning Tree - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/34866\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Swift Coding Test Course, Finding Minimum Spanning Tree - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Today, we will take a detailed look at one of the algorithm problems that frequently appear in coding tests: finding the Minimum Spanning Tree (MST). A minimum spanning tree is a tree that includes all the vertices of a given weighted graph, while having the minimum possible sum of weights. To solve this problem, we &hellip; \ub354 \ubcf4\uae30 &quot;Swift Coding Test Course, Finding Minimum Spanning Tree&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/34866\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:32:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:26:11+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/34866\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/34866\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Swift Coding Test Course, Finding Minimum Spanning Tree\",\"datePublished\":\"2024-11-01T09:32:54+00:00\",\"dateModified\":\"2024-11-01T11:26:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/34866\/\"},\"wordCount\":417,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"Swift Coding Test\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/34866\/\",\"url\":\"https:\/\/atmokpo.com\/w\/34866\/\",\"name\":\"Swift Coding Test Course, Finding Minimum Spanning Tree - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:32:54+00:00\",\"dateModified\":\"2024-11-01T11:26:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/34866\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/34866\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/34866\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Swift Coding Test Course, Finding Minimum Spanning Tree\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Swift Coding Test Course, Finding Minimum Spanning Tree - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/34866\/","og_locale":"ko_KR","og_type":"article","og_title":"Swift Coding Test Course, Finding Minimum Spanning Tree - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Today, we will take a detailed look at one of the algorithm problems that frequently appear in coding tests: finding the Minimum Spanning Tree (MST). A minimum spanning tree is a tree that includes all the vertices of a given weighted graph, while having the minimum possible sum of weights. To solve this problem, we &hellip; \ub354 \ubcf4\uae30 \"Swift Coding Test Course, Finding Minimum Spanning Tree\"","og_url":"https:\/\/atmokpo.com\/w\/34866\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:32:54+00:00","article_modified_time":"2024-11-01T11:26:11+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"3\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/34866\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/34866\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Swift Coding Test Course, Finding Minimum Spanning Tree","datePublished":"2024-11-01T09:32:54+00:00","dateModified":"2024-11-01T11:26:11+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/34866\/"},"wordCount":417,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["Swift Coding Test"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/34866\/","url":"https:\/\/atmokpo.com\/w\/34866\/","name":"Swift Coding Test Course, Finding Minimum Spanning Tree - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:32:54+00:00","dateModified":"2024-11-01T11:26:11+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/34866\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/34866\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/34866\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Swift Coding Test Course, Finding Minimum Spanning Tree"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/34866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=34866"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/34866\/revisions"}],"predecessor-version":[{"id":34867,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/34866\/revisions\/34867"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=34866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=34866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=34866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}