λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Problem Solving

[Java] λ°±μ€€ 21276 - 계보 볡원가 ν˜Έμ„

https://www.acmicpc.net/problem/21276


풀이

  • 쑰상-μžμ† 관계λ₯Ό μ΄μš©ν•΄μ„œ μœ„μƒ μ •λ ¬
  • λΆ€λͺ¨-μžμ‹ 관계λ₯Ό 좜λ ₯ν•˜λŠ” 건 전체 좜λ ₯μ—μ„œ μžμ‹μ˜ 이름이 ν•œ 번만 λ“±μž₯ν•œλ‹€λŠ” 점을 μ΄μš©ν•  수 있음. κ°€μž₯ λ°‘μ—μ„œ λΆ€ν„° μœ„λ‘œ μ˜¬λΌκ°€λ©΄μ„œ μžμ‹λ“€μ„ 좜λ ₯ν•˜λŠ”λ° 이미 λ‚˜μ˜¨ 이름은 좜λ ₯ν•˜μ§€ μ•Šλ„λ‘ ν•˜λ©΄ 됨.
  • λ¬Έμžμ—΄ μ²˜λ¦¬λ₯Ό μœ„ν•΄ HashMap μ‚¬μš©

μ½”λ“œ

더보기
import java.io.*;
import java.util.*;

public class Main {
	public static class Person {
		public String name;
		public int indegree, outdegree;
		public ArrayList<Person> ancestors;
		public ArrayList<Person> descendants;
		public ArrayList<String> children;

		public Person(String name) {
			this.name = name;
			indegree = 0;
			outdegree = 0;
			ancestors = new ArrayList<>();
			descendants = new ArrayList<>();
			children = new ArrayList<>();
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		HashMap<String, Person> map = new HashMap<>();
		ArrayList<String> list = new ArrayList<>();
		ArrayList<String> progenitors = new ArrayList<>();
		StringTokenizer st = new StringTokenizer(br.readLine());

		for (int i = 0; i < N; i++) {
			String name = st.nextToken();
			Person p = new Person(name);
			list.add(name);
			map.put(name, p);
		}

		int M = Integer.parseInt(br.readLine());

		while (M-- > 0) {
			st = new StringTokenizer(br.readLine());
			String descendant = st.nextToken();
			String ancestor = st.nextToken();
			map.get(descendant).ancestors.add(map.get(ancestor));
			map.get(descendant).outdegree++;
			map.get(ancestor).indegree++;
		}

		Stack<Person> stack = new Stack<>();
		HashSet<Person> usedChildren = new HashSet<>();
		int K = 0;

		for (String name : map.keySet()) {
			if (map.get(name).indegree == 0) {
				stack.add(map.get(name));
			}
			if (map.get(name).outdegree == 0) {
				progenitors.add(name);
				K++;
			}
		}

		while (!stack.empty()) {
			Person cur = stack.pop();

			for (Person p : cur.descendants) {
				if (!usedChildren.contains(p)) {
					usedChildren.add(p);
					cur.children.add(p.name);
				}
			}

			for (Person p : cur.ancestors) {
				p.descendants.add(cur);
				if (--p.indegree == 0) {
					stack.add(p);
				}
			}
		}

		StringBuilder sb = new StringBuilder().append(K).append('\n');
		Collections.sort(progenitors);
		Collections.sort(list);

		for (String name : progenitors) {
			sb.append(name).append(' ');
		}
		sb.append('\n');

		for (String name : list) {
			sb.append(name).append(' ').append(map.get(name).children.size());
			Collections.sort(map.get(name).children);
			for (String childName : map.get(name).children) {
				sb.append(' ').append(childName);
			}
			sb.append('\n');
		}

		System.out.println(sb);
		br.close();
	}
}

ν›„κΈ°

λ‚΄κ°€ μš”λ Ήμ΄ μ—†λŠ” 건지 κ΅¬ν˜„ν•˜λŠ”λ° 이것 저것 μ‹ κ²½ μ“°μ΄λŠ” 게 λ§Žμ•˜λ˜ 문제,,
μžμ†μ—μ„œ μ‘°μƒμœΌλ‘œ μ˜¬λΌμ˜€κΈ° λ³΄λ‹€λŠ” μ—­λ°©ν–₯으둜 λ‚΄λ €μ˜€λŠ” κ²Œ λ” μ‰½λ‹€λŠ” κ²ƒ κ°™λ‹€