UnionFind 9

[BOJ] 1043. 거짓말

유니온파인드를 이용하는 문제였다. 문제를 맨처음 접근함에 있어서 파티의 순서가 보장된다고 생각하여 단순하게 생각하였지만, 테스트 케이스를 보고 파티의 순서가 보장되지 않음을 알게 되었고 다시 생각하게 되었다. 다시 생각해보니 같은 파티마다 서로 연결되는 성질을 보았을 떄 유니온파인드가 생각이 나서 적용을 해보았다. 우선 파티의 인원을 전부 입력을 받고, 파티마다 참석자들을 union 해주었다. 그 후 이미 진실을 알고 있는 자 들과 파티의 참석자간의 루트값을 비교하여서 진실을 알고있는 사람들을 모두 선별해주고, 그것을 기준으로 거짓을 얘기할 수 있는 파티를 찾았다. 유니온파인드를 사용할때 주의할점이 있는데 서로의 루트 노드가 같은지를 확인할 때에는 단순히 p[i] , p[j] 값을 비교하는게 아니라 fi..

Algorithm 2021.05.04

[BOJ] 2887. 행성 터널

모든 정점을 N-1개로 연결하는 MST 문제이다. MST를 해결하기 위해선 간선기준인 Kruskal 알고리즘과 정점기준인 Prim 알고리즘을 사용할 수 있다. 두 문제는 어쨋든 출발점, 도착점 비용을 알아야하기 때문에 문제에서 비용을 구하는 방법을 생각해보았다. N이 최대 100,000임으로 2중for문은 사용불가하여 고민해본 결과, 전체 정점을 x,y,z로 각 각 정렬했을때 하나 뒤의 정점과의 x,y,z 차이를 이용하여 간선을 구하는 방법을 고안하였다. 이렇게 모든 간선들의 비용을 PriorityQueue에 저장한다음 UnionFind를 이용하여 MST를 구하였다. 그래프의 간선들을 만듬에 있어 충분한 고민이 필요했던 문제였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17..

Algorithm 2020.05.17

[BOJ] 10775. 공항

유니온파인드를 이용하는 문제이다. 프로그래머스의 호텔방배정과 상당히 유사한 문제이다. 다만 이문제는 이하를 찾는점이 앞의 문제와 다른점이다. 비행기의 번호가 들어오면 그 비행기의 부모를 찾아주고, 그찾은 부모와 하나 부모이하를 union해주는 과정을 거친다. 만일 비행기의 부모가 0이 오면 더이상 추가할수가 없다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 package boj2; import java.io.BufferedReader; import java.io.InputStream..

Algorithm 2020.05.15

[BOJ] 1976. 여행 가자

유니온 파인드를 이용하는 문제이다. 이차원 배열상 서로 연결되어있다고 표시된 지역은 merge(union)함수를 이용하여 서로 부모를 맞추어주는 작업을 끝낸다음 마지막에 find를 이용하여 모든 여행지점이 같은 부모를 같는지 확인하는 방식으로 풀이하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 package boj1; i..

Algorithm 2020.05.15

[BOJ] 4195. 친구 네트워크

이 문제는 유니온파인드를 사용하는 문제이다. 유니온파인드를 사용하고 같은 그룹안에 몇개의 원소가 있는지 구하는 문제이다. 이 문제는 주의할점이 있다. 바로 입력의 형태가 문자열의 형태로 들어오기때문에 HashMap을 이용하여 이름을 인덱싱해주는 작업이 필요하다. 인덱싱을 해준후 count라는 배열을 이용하여 union할때마다 원소를 합쳐주는 과정을 거쳐 최종 결과를 출력해주면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64..

Algorithm 2020.05.07

[BOJ] 2606. 바이러스

유니온파인드 내지는 DFS를 이용하여 1과 연결된 것을 찾는 문제이다. 첫번째로 유니온파인드로 구현해보았다. 이문제에서 유니온파인드를 사용하면서 두가지 주의할점을 찾았다. 첫째, 경로의 최적화를 하기위해 find함수에서 return find(p[num]);대신 return p[num]=find(p[num]);을 사용해주었다. 둘째로 마지막에 모든 정점에 대하여 find함수를 한번씩 실행시켜줘서 부모를 저장하고있는 p배열을 갱신해주는 작업을 하였다. 이 작업은 필수적으로 해야하는 작업인데 놓치기 쉬움으로 항상 습관적으로 해야한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ..

Algorithm 2020.05.06

[Programmers] 호텔 방 배정

이 문제는 간단해 보이나 효율성을 통과하기 어려운 문제이다. 일반적인 풀이방법으로는 정확성은 통과할 수 있지만 유니온파인드 알고리즘을 사용하지 않는다면 효율성을 통과하기 어렵다. 또한, 유니온 파인드라는 것을 사용한다 하더라도 K값이 상당히 큼(10^12)으로 일차원 배열을 사용하기 어렵다. 따라서 필요한 것에 대해서만 HashMap의 형태로 유니온파인드를 사용해야한다. 이 문제는 다음과 같은 로직을 적용하였다. 1. room_number의 수를 전체 하나씩 보기 2-1. 수가 hashMap에 존재하지 않는 key이거나 (수,수) 의 형태로 존재한다면 현재 key를 배정 2-2. 그렇지 않다면 find(map.get(key))를 하여 새로운 방을 배정 3. 마지막으로 현재수와 현재수+1을 union 아이..

Algorithm 2020.05.05

[BOJ] 1197. 최소 스패닝 트리

MST 문제이다. 이 문제를 풀기 위해선 Kruskal 이나 Prim을 사용해야한다. 참고 이 문제를 두가지방법 모두 사용하여 풀어보았다. 첫번째로 Kruskal 알고리즘을 사용하였는데 , 정렬을 함에 있어 PriorityQueue를 사용하였고, 같은 팀임을 보기 위해 UnionFind를 같이 사용하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 7..

Algorithm 2020.04.09

[SWEA] 1251. 하나로

최소신장트리 즉, MST를 구하는 문제이다. 최소신장트리란 , 그래프에서 V개의 접점과 E개의 간선이 있을 때, V-1개의 간선으로 이루어진 트리로 싸이클이 생겨나지 않고, 방향이 없으며 간선들의 합이 최소일 때를 말한다. 구하는 대표적인 알고리즘으로는 Kruskal, Prim이 있다. ※그래프 정점V 와 간선E로 이루어진 연결관계를 모아 놓은 자료. 프로그래밍상 표현법은 다음과 같다. - 간선의 배열 : 정점과 정점의 연결정보인 간선을 모아놓음 - 인접 리스트 : 각 정점별로 연결된 정점의 정보를 모아놓음(ex. List[]) - 인접행렬 : 2차원 행렬에 각 정점과 정점간의 연결정보를 표시(ex. arr[][]) ※Kruskal 알고리즘 그래프에서 간선을 기준으로 MST를 찾고 싶을 때 사용하는 알고..

Algorithm 2020.04.09