-
728x90๋ฐ์ํ
๋ ์ง : 2021 ๋ 11 ์ 5 ์ผ
์์ฒญ ๊ฐ์ : ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ดํด์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ (1) ~ (4)๊ทธ๋ํ ํ์ : ํฌ๋ฃจ์ค์นผ๊ณผ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๋ฌธ์ ์ด๋ค.
์ด์ค์์, ์ค๋์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๋ฐฐ์ ๋ค.
์ ์ฅ ํธ๋ฆฌ (Spanning Tree)
- ์ ์ฒด ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค.
- ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋๋ค.
์ด๋ฏธ์ง ์ถ์ฒ : Tutorialspoint ์ ๊ทธ๋ํ์์, ๊ทธ๋ํ G ๋ ์ฌ์ดํด์ด ์กด์ฌํ๋ค.
์คํจ๋ ํธ๋ฆฌ๋, ๋ชจ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด์์ผ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๊ทธ๋ํ๋ค
์ต์ ์ ์ฅ ํธ๋ฆฌ
- ๊ฐ์ค์น๊ฐ ์กด์ฌํ๋ ์ ์ฅ ํธ๋ฆฌ ์ค, ๊ฐ์ ์ ํฉ(weight)์ด ๊ฐ์ฅ ์์ ํธ๋ฆฌ
๋ง์ฝ, ์์ ์ ์ฅ ํธ๋ฆฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ ๋ค๋ฉด, ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ํธ๋ฆฌ๋ก ์ฒซ๋ฒ์งธ ์คํจ๋ ํธ๋ฆฌ๊ฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ๊ฐ ๋๋ค.
ํ์ค ์ธ๊ณ์์ ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋๋ ์๋ก ์ต๋จ๊ฑฐ๋ฆฌ ๊ธธ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ด ์๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ์ฐพ์๋ธ๋ค
์ด ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ ๋ฆฝ์ ์ธ ์งํฉ์ผ๋ก ๋ง๋ฆ
- ๋น์ฉ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ์ ๋ ฌ (์ต์๊ฐ ๊ฐ์ฅ ์์์ค๊ฒํ๋ค)
- ๋ ์ ์ ์ ๋ฃจํธ๋ฅผ ํ์ธํ๊ณ , ๋ฃจํธ๊ฐ ์๋ก ๋ค๋ฅผ๊ฒฝ์ฐ์๋ง ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ค
๋ง์ฝ, ๋ ์ ์ ์ ๋ฃจํธ๊ฐ ๊ฐ๋ค๋ฉด ์ฌ์ดํด์ด ๋ฐ์ํ๊ฒ ๋๋ค. ์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
์์๊ฐ์ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
B์ C๋ ๋ฃจํธ๊ฐ ๊ฐ๋ค (A)
B ์ C๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์ฌ์ดํด์ด ์์ฑ๋๊ณ , ๋์ด์ ์ ์ฅ ํธ๋ฆฌ๊ฐ ์๋๊ฒ ๋๋ค.
๊ตฌํ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ ๋ค๋ฉด, ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผํ ๊น.
์์ ๋งํ๋ฏ์ด, ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ ๋ฆฝ์ ์ธ ์งํฉ์ผ๋ก ๋ง๋ฆ
- ๋น์ฉ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ์ ๋ ฌ (์ต์๊ฐ ๊ฐ์ฅ ์์์ค๊ฒํ๋ค)
- ๋ ์ ์ ์ ๋ฃจํธ๋ฅผ ํ์ธํ๊ณ , ๋ฃจํธ๊ฐ ์๋ก ๋ค๋ฅผ๊ฒฝ์ฐ์๋ง ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ค
Union-Find ์๊ณ ๋ฆฌ์ฆ
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ์ด๋ผ๊ณ ํ ์ ์๋, ์ฌ์ดํด์ ์ ๋ฌด๋ฅผ ํ๋จํ๊ธฐ ์ํด ์ ๋์จํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ์ํด์๋ ๋จผ์ ,
1. ๋ชจ๋ ์ ์ ์ ๋ ๋ฆฝ์ ์ธ ์งํฉ์ผ๋ก ์ด๊ธฐํ ์ํจ๋ค.
A B C D E F G H ๊ฐ ๋ ธ๋๋ค์ ๋ถ๋ฆฌ์ํค๊ณ , ๋ณธ์ธ ๋ ธ๋๋ฅผ ๋ณธ์ธ์๋ง ์ฐ๊ฒฐ์์ผ ์ด๊ธฐํ ํ๋ค.
2. Union : ๋๊ฐ์ ์งํฉ์ ํ๋๋ก ํฉ์น๋ค
tree1 + tree2 = newTree
ํธ๋ฆฌ๋ค์ ๊ฐ์ค์น๊ฐ ๋ฎ์ ํธ๋ฆฌ๋ฅผ ๊ณจ๋ผ์ ํฉ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ Union ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ํธ๋ฆฌ๋ฅผ ํฉ์น๋ค
3. Find : ๋ ๋ ธ๋์ ๋ฃจํธ๊ฐ ๊ฐ์์ง ํ๋จํ๋ค
๋ ๋ ธ๋์ ๋ฃจํธ๊ฐ ๊ฐ๋ค๋ฉด, ์ฌ์ดํด์ด ์์ฑ๋๊ธฐ ๋๋ฌธ์ Find๋ฅผ ํตํ์ฌ ๋ฃจํธ๋ฅผ ์ฐพ์๋ธ๋ค.
Union-by-rank ์ Path-Compression ์๊ณ ๋ฆฌ์ฆ
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์, ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ต์ ์ ๊ฒฝ์ฐ ๋งํฌ๋๋ฆฌ์คํธ๊ฐ์ ํํ๊ฐ ๋ ์ ์๋ค.
์ด๋ฏธ์ง ์ถ์ฒ : studytonight ์๋ฅผ ๋ค์ด, ์ ๊ทธ๋ํ๋ฅผ ํ์ธํด๋ณด์.
a ๋ ธ๋๊ฐ ๋ฃจํธ๋ผ๊ณ ๊ฐ์ ํ์ ๋, e ๋ ธ๋์ ๋ฃจํธ๋ฅผ ์ฐพ๊ธฐ ์ํด์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ์ผํ๋ค.
์ด๋ ๊ฒ, ๋งํฌ๋ ๋ฆฌ์คํธ์ ํํ๋ฅผ ๋๊ฒ ๋๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ ๋์์ง๊ฒ ๋๋๋ฐ (O(N)) , ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด Union-by-rank ์ Path - compression ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
Union-by-rank
rank ๋ฅผ ๊ธฐ์ตํ๊ณ , union ์ ๋ ํธ๋ฆฌ์ ๋ญํฌ๊ฐ ๋ค๋ฅด๋ฉด ๋์ด๊ฐ ์์ ํธ๋ฆฌ๋ฅผ ํฐ ํธ๋ฆฌ์ ๋ถ์ด๊ณ ๋์ด๊ฐ ๊ฐ๋ค๋ฉด ํ์ชฝ์ ํฌ๊ฒ ๋ง๋ค๊ณ ํฉ์ฒดํ๋ค.
์ด๋ฏธ์ง ์ถ์ฒ : Lemidia's Programming ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ฉด ๋์ด๊ฐ ๋ฌดํ์ ๋์์ง๋๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
Path Compression
1. find๋ฅผ ์คํํ ๋ ธ๋์์ ๊ฑฐ์ณ๊ฐ ๋ ธ๋๋ฅผ ๋ฃจํธ์ ๋ค์ด๋ํธ๋ก ์ฐ๊ฒฐ์ํด
2. find๋ฅผ ์คํํ ๋ ธ๋๋, ์ดํ๋ถํฐ ๋ฃจํธ ๋ ธ๋๊ฐ ๋๊ตฌ์ธ์ง ํ๋ฒ์ ์ ์ ์์
์ด๋ฏธ์ง ์ถ์ฒ : Wikimedia Commons ์ ๊ทธ๋ฆผ์์, a์ ๋ฃจํธ๋ฅผ ์ฐพ๊ธฐ ์ํด find ๋ฅผ ์คํํ๊ฒ ๋๋ฉด : a ๋ถ๋ชจ๋ b, b์ ๋ถ๋ชจ๋ c, c์ ๋ถ๋ชจ๋ d . d๋ ๋ถ๋ชจ๊ฐ ์๊ธฐ ์์ ์ด๋ฏ๋ก ๋ฃจํธ ๋ ธ๋์ด๋ค.
ํ์ง๋ง, ๊ณ์ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ฃจํธ๋ฅผ ์ฐพ๋๊ฒ์ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์, ์ด๋ ๊ฒ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐ๋ก ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋งค๋ฒ ๋ถ๋ชจ๋ฅผ ์ ๋ฐ์ดํธ ์์ผ์ ์ผ๋ ฌ๋ก ๋์ดํ๋ ๋ฐฉ์์ด๋ค.
a: ๋ถ๋ชจ- b
b: ๋ถ๋ชจ - c -> a์ ๋ฃจํธ๋ฅผ c๋ก ์ ๋ฐ์ดํธ
c: ๋ถ๋ชจ -d -> a,b์ ๋ฃจํธ๋ฅผ d๋ก ์ ๋ฐ์ดํธ
์ฝ๋ ๊ตฌํ
์์์ ๋งํ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฐ ์ฝ๋๋ก ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ค์์ด ํ์ํ๋ค:
- Node Class : ๊ฐ์ค์น, ์ ๋ ฌ ์ค๋ฒ๋ผ์ด๋
- Find method : ๋ฃจํธ๋ฅผ ์ฐพ๋๋ค (path compression ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์๊ฐ ๋จ์ถ)
- Union method : ๊ฐ์ ์ ์ฐ๊ฒฐํ๋ค (union by rank ๊ธฐ๋ฒ์ ์ฌ์ฉ)
- MakeSet method: ๋ญํฌ๋ฅผ ์ด๋ฐ์ ์ด๊ธฐํ ์์ผ์ ๋ชจ๋ ์ ์ ์ ๋ ๋ฆฝ์ ์ธ ์ ์ ์ผ๋ก ๋ง๋ค๊ณ ์์ํ ๋ฉ์๋
- Kruskal method: ์ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ง์ ์ผ๋ก ๊ตฌํํ ๋ฉ์๋
์์ํ๊ธฐ ์์, ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ธฐ๋กํ ํด์ฌ๋งต๊ณผ ๋ณธ์ธ ๋ญํฌ๋ฅผ ๊ธฐ๋กํ ํด์ฌ๋งต์ ์ค์ ํด์ค๋ค.
HashMap<String, String> parent = HashMap<>();HashMap<String, Integer> rank = HashMap<>();1. ๋ ธ๋ ํด๋์ค
์ ๋ ฌ ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ weight์ด ํต์ฌpublic static class Node implements Comparable<Node>{int weight, V, U;//setter method ๊ตฌํ@Overridepublic int compareTo(Node node){return this.weight - node.weight;}}2. Find Method
Path Compression ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์๊ฐ ๋ณต์ก๋ ๋จ์ถpublic String find (String node) {if(parent.get(node)!=node){ //์๊ธฐ ๋ถ๋ชจ๊ฐ ๋ฃจํธ๊ฐ ์๋๋ผ๋ฉดparent.put(node.this.find(this.parent.get(node))); //๋ถ๋ชจ์ ๋ถ๋ชจ ์ฐพ๊ธฐ}retunr this.parent.get(node);//์ต์ข ๋ฃจํธ ๋ฐํ}3. Union Method
Union by Rank ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ, ๋ ๊ฐ์ ์ ์ฐ๊ฒฐํ๋คpublic void union(String u, String v){ //๋ ธ๋ u์ ๋ ธ๋ vString root1 = find(u); //๋ ธ๋ u์ ๋ฃจํธ๋ฅผ ์ฐพ๋๋คString root2 = find(v); //๋ ธ๋ v์ ๋ฃจํธ๋ฅผ ์ฐพ๋๋ค//union by rank ๊ธฐ๋ฒif(rank.get(root1) > rank.get(root2)){ //u์ ๋ญํฌ๊ฐ v์ ๋ญํฌ๋ณด๋ค ํฌ๋ค๋ฉด v๋ฅผ u์ ๋ํ๋คparent.put(root2, root1);}else{parent.put(root1, root2); //๋ฐ๋์ธ ์ํฉif(rank.get(root1) == rank.get(root2){ //๋ง์ฝ ๋ญํฌ๊ฐ ๊ฐ์ผ๋ฉด ํ๋๋ฅผ ์กฐ์ ํ๋คrank.put(root2, rank.get(root2)+1 ); //๋ฃจํธ 2์ ๋ญํฌ๋ฅผ ์กฐ์ ์ํด}}}4. ์ด๊ธฐํ
์ ์ฒด ๋ ธ๋๋ฅผ ํ๋์ฉ ๋ฐ์ ์์ ์ ๋ฃจํธ ๋ ธ๋๋ก ๋ง๋ค๊ณ ๋ญํฌ๋ฅผ 0์ผ๋ก ์ด๊ธฐํ ์์ผ์
๋ถ๋ฆฌ๋ set ์ผ๋ก ๋ง๋๋ ์์public void makeSet(String node) {parent.put(node, node) ;//์๊ธฐ ์์ ์ฐ๊ฒฐrank.put(node, 0);//๋ญํฌ 0์ผ๋ก ์ด๊ธฐํ}5. ํฌ๋ฃจ์ค์นผ ๋ฉ์๋
์์ ๊ตฌํํ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ฆฌํดํ๋ค. (์ต๋จ๊ฒฝ๋ก)// nodes : ๊ฐ ๋ ธ๋๋ฅผ ๋ด์ ๋ฆฌ์คํธ [ex : "a", "b", "c", "d"]// infoList : ๊ฐ ๋ ธ๋ ์ ๋ณด๋ค์ ๋ด์ ๋ฆฌ์คํธ [ex : u = "a", v = "b", weight = "3"]public ArrayList<Node> Kruskal (ArrayList<String> nodes, ArrayList<Node> infoList){ArrayList<Node> mst = new ArrayList<>();//์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ด์ ์ต์์ ์ฅ๋ฆฌ์คํธ//์ด๊ธฐํfor(int i = 0 ; i< nodes.size() ; i++){ this.makeSet(nodes.get(i);}//๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก sortCollections.sort(infoList);//์ต๋จ๊ฒฝ๋กfor(int i = 0 ; i < infoList.size() ; i++){if(find(infoList.get(i).u) != find(infoList.get(i).v){ //from-to์ ๋ฃจํธ๊ฐ ๋ค๋ฅผ๋ : ์ถ๊ฐ๊ฐ๋ฅunion(infoList.get(i).u , infoList.get(i).v); //ํธ๋ฆฌ ํฉ์ฒดmst.add(infoList.get(i)); //์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํ์ฌ ๊ฒฝ๋ก ์ถ๊ฐ}}return mst ; //์ต์ ์ ์ฅ ํธ๋ฆฌ(์ต๋จ๊ฒฝ๋ก)๋ฅผ ๋ฐํ}}
ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ๋ฐ๋ก๊ฐ๊ธฐ๐ https://bit.ly/3FVdhDa
์๊ฐ๋ฃ 100% ํ๊ธ ์ฑ๋ฆฐ์ง | ํจ์คํธ์บ ํผ์ค
๋ฑ 5์ผ๊ฐ ์งํ๋๋ ํ๊ธ์ฑ๋ฆฐ์ง๋ก ์๊ฐ๋ฃ 100% ํ๊ธ๋ฐ์ผ์ธ์! ๋ ๋ฆ๊ธฐ์ ์ ์๊ธฐ๊ณ๋ฐ ๋ง์ฐจ ํ์น!
fastcampus.co.kr
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑ๋์์ต๋๋ค.
728x90๋ฐ์ํ'๐ STUDY > FASTCAMPUS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 7์ผ์ฐจ (0) 2021.11.07 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 6์ผ์ฐจ (0) 2021.11.06 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 4์ผ์ฐจ (0) 2021.11.04 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 3์ผ์ฐจ (0) 2021.11.03 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 2์ผ์ฐจ (0) 2021.11.02