1. 문제
https://www.acmicpc.net/problem/4195
2. 접근방법
union find의 기본형 문제
숫자 대신 String으로 주어지는 것만 다르다.
Map으로 부모관계를 나타내주고
다른 Map으로 가장 최상위 부모에게만 현재 네트워크의 친구 수를 저장한다.
union 되는 과정에서 두 네트워크의 친구수만 더해서 저장해주면 된다.
그리고 find할 때 모든 노드의 부모를 최상위 부모로 바꾸는 작업을 했는데
안하면 시간초과 날지도?
또 이미 같은 네트워크인 친구 둘이 나왔을 때의 예외처리도 해주어야 한다.
3. 자바 코드
package backjoon;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class P4195친구네트워크 {
static Map<String, String> parentMap;
static Map<String, Integer> networkMap;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
parentMap = new HashMap<>();
networkMap = new HashMap<>();
int F = Integer.parseInt(br.readLine());
while (F-- > 0) {
st = new StringTokenizer(br.readLine());
String a = st.nextToken();
String b = st.nextToken();
System.out.println(union(a,b));
}
}
}
static int union(String a, String b) {
String aBoss = find(a);
String bBoss = find(b);
int aNetwork = networkMap.getOrDefault(aBoss, 1);
int bNetwork = networkMap.getOrDefault(bBoss, 1);
if(aBoss.equals(bBoss))
return aNetwork;
parentMap.put(bBoss, aBoss);
networkMap.put(aBoss, aNetwork + bNetwork);
return aNetwork + bNetwork;
}
static String find(String a) {
String parent = parentMap.getOrDefault(a, a);
if (parent.equals(a))
return a;
else {
String boss = find(parent);
parentMap.put(a, boss);
return boss;
}
}
}
4. 마치며
책정된 난이도에 비해 평이했다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준] 1655 가운데를 말해요 (0) | 2022.11.07 |
---|---|
[백준] 1036 36진수 (0) | 2022.11.03 |
[백준] 1043 거짓말 (1) | 2022.10.14 |
[백준] 1967 트리의 지름 (2) | 2022.10.07 |
[백준] 1969 DNA (0) | 2022.07.29 |