image

백준 4195: 친구 네트워크

Link: https://www.acmicpc.net/problem/4195

풀이

  • 문자열을 이용한 Union-Find
  • 인덱스를 문자열로 써야 하기 때문에 기존의 배열 형태의 Union-Find가 불가능
  • HashMap을 이욯애 Key를 Index로 사용하고 Value를 Parent로 사용.
  • Network 내부 친구의 수 또한 HashMap을 이용해 저장.
package algorithm2024.mar.day08;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class BOJ_4195_친구네트워크 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static StringBuilder sb = new StringBuilder();
	static HashMap<String, String> parent;
	static HashMap<String, Integer> network;

	/*Union-Find
	* 문자열을 인덱스로 사용하는 Union-find
	* 기존의 Union-find에서 사용하는 parent 배열과 인접 리스트 혹은 행렬을 모두 HashMap으로 대체
	*/
	static int union(String f1, String f2) {
		String pf1 = find(f1);
		String pf2 = find(f2);
		if(!pf1.equals(pf2)){
			parent.put(pf2,pf1);
			network.put(pf1, network.get(pf2)+network.get(pf1));
		}
		return network.get(pf1);
	}

	static String find(String f) {
		if(parent.get(f).equals(f))return f;
		String p = find(parent.get(f));
		parent.put(f,p);
		return p;
	}
	public static void main(String[] args) throws Exception {
		int T = Integer.parseInt(br.readLine());
		for (int i = 0; i < T; i++) {
			int F = Integer.parseInt(br.readLine());


			//네트워크의 root를 지정하는 parent 맵과 network의 총 친구 수를 저장하는 network 맵
			parent = new HashMap<>();
			network = new HashMap<>();

			/*
			* 매 번 입력 받을 때 마다 이미 존재하면 기존의 값 put, 없으면 초기 값 put.
			* 초기 값: parent-본인 이름, network-1
			* put 이후에 두 이름으로 union 진행*/
			for (int j = 0; j < F; j++) {
				st = new StringTokenizer(br.readLine());
				String f1 = st.nextToken();
				String f2 = st.nextToken();
				parent.put(f1,parent.getOrDefault(f1,f1));
				network.put(f1,network.getOrDefault(f1,1));
				parent.put(f2,parent.getOrDefault(f2,f2));
				network.put(f2,network.getOrDefault(f2,1));
				sb.append(union(f1,f2)).append("\n");
			}
		}
		System.out.println(sb);
	}

}



Issue

  • 삼성 B형 공부때문에 자료구조 문제를 계속해서 푸는 중이었는데 되게 괜찮은 문제를 푼 것 같음.
  • 난이도에 비해 풀이도 빨리 생각하고 빠르게 푼 것 같아 기분이 좋다!

Leave a comment