λ¬Έμ
νμ΄
1οΈβ£ μμ μ λ ¬κ³Ό μ°μ μμ νλ₯Ό νμ©ν νμ΄
π‘ λ μ€λ₯Έ Idea
μ΄ λ¬Έμ μμ κ°μ₯ μ€μν ν¬μΈνΈλ μ§κ³ μμμμ μ΄λ»κ² νμ νλκ°μλ€.
haeun doha
doha minji
haeun minji
μμ κ°μ΄ κ΄κ³κ° μ£Όμ΄μ‘μ λ
νμμ λνμ λ―Όμ§μ μμμ΄κ³
λνλ λ―Όμ§μ μμμμ μ μ μλλ°
λ€μ΄μ€λ κ°μ μ μλ₯Ό 보면
λ―Όμ§ : 0
λν : 1
νμ : 2
μμ μ μ μλ€.
μμ μ λ ¬μ λ°λΌ μ λ ¬νλ©΄ λ―Όμ§μμ μμν΄μ λ―Όμ§μ μ°κ²°λ κ°μ μ μ§μ°κ² λλλ°
κ·Έλ¬λ©΄
μμ κ°μ΄ λκ³ κ°μ μ μκ°
λ―Όμ§ : 0
λν : 0
νμ : 1
μμ μ μ μλ€.
μ¦, μ°κ²°λ κ°μ μ μ§μ μ λ, 0μ΄ λλ μμμ μ§κ³ μμμ΄ λ¨μ μ μ μλ€.
μ΄ κ°λ κ³Ό μμ μ λ ¬μ μ¬μ©νλ©΄ μ½κ² ν΄κ²°ν μ μλ λ¬Έμ μλ€.
κ·Έλ¦¬κ³ μ¬μ μμΌλ‘ μ λ ¬νλ κ³Όμ μ΄ νμνκΈ° λλ¬Έμ, Listλ‘ λ°μ΄ν°λ₯Ό μ λ ₯λ°μμ sort λ₯Ό μ¬μ©ν΄λ λκΈ΄ νμ§λ§
λ¨μ μ¬μ μ μ λ ¬μ΄λ―λ‘ μ°μ μμνλ₯Ό μ΄μ©νμλ€.
public class Main {
// κ³λ³΄ μ μμ κ΄κ³ λͺ¨λ μ μ₯
static Map<String, List<String>> relation = new HashMap<>();
// μ§κ³ μμλ§ μ μ₯
static Map<String, PriorityQueue<String>> directChildren = new HashMap<>();
// κ° μ¬λ λ³ κ°μ μ΄ μ€λ κ°μ μ μ₯
static Map<String, Integer> indegree = new HashMap<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
for (int i = 0; i < input.length; i++) {
String name = input[i];
relation.put(name, new ArrayList<>());
directChildren.put(name, new PriorityQueue<>());
indegree.put(name, 0);
}
int M = Integer.parseInt(br.readLine());
for (int i = 0; i < M; i++) {
input = br.readLine().split(" ");
String young = input[0];
String old = input[1];
// κ³λ³΄ μ μμ(μ§κ³μΈμ§ μλμ§λ λͺ¨λ¦) μΆκ°
relation.get(old).add(young);
// μμλ€μ inDegree κ° μ¦κ°
indegree.put(young, indegree.get(young) + 1);
}
StringBuilder ans = new StringBuilder();
Queue<String> q = new LinkedList<>();
PriorityQueue<String> pq = new PriorityQueue<>();
int K = 0;
for (String name : indegree.keySet()) {
// λ€μ΄μ€λ κ°μ μ΄ μλ€λ κ²μ μ΅κ³ μ‘°μμ΄λΌλ μλ―Έ
if (indegree.get(name) == 0) {
K++;
pq.offer(name);
q.offer(name);
}
}
ans.append(K + "\n");
while (!pq.isEmpty()) {
ans.append(pq.poll() + " ");
}
ans.append("\n");
// μμ μ λ ¬
while (!q.isEmpty()) {
String parent = q.poll();
List<String> children = relation.get(parent);
for (String child : children) {
int n = indegree.get(child);
// κ°μ μ΄ 1κ° λ¨μμλ κ²½μ° μ§κ³ μμ
// λ€μ΄μ€λ κ°μ μ΄ 0μ΄ λλ κ²½μ° νμ μΆκ°
if (n == 1) {
directChildren.get(parent).add(child);
q.offer(child);
}
indegree.put(child, n - 1);
}
}
// μ§κ³ μμ ꡬνκΈ°
for (String parent : directChildren.keySet()) {
StringBuilder sb = new StringBuilder();
PriorityQueue<String> children = directChildren.get(parent);
sb.append(parent + " " + children.size() + " ");
while (!children.isEmpty()) {
sb.append(children.poll() + " ");
}
pq.offer(sb.toString());
}
while (!pq.isEmpty()) {
ans.append(pq.poll() + "\n");
}
System.out.println(ans);
}
}
κ²°κ³Ό