우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/바킹독

[JAVA] λ°±μ€€ 21276번 【G2.계보 볡원가 ν˜Έμ„γ€‘

2023. 10. 6. 10:19

문제

 

21276번: 계보 볡원가 ν˜Έμ„

μ„ν˜Έμ΄Œμ—λŠ” N λͺ…μ˜ μ‚¬λžŒμ΄ μ‚΄κ³  μžˆλ‹€. ꡉμž₯히 ν™œλ°œν•œ μ„±κ²©μΈ μ„ν˜Έμ΄Œ μ‚¬λžŒλ“€μ€ μ˜† μ§‘ 상도 μ•„λ²„λ‹˜, λ’·μ§‘ ν•˜μ€ ν• λ¨Έλ‹˜ , κ°• κ±΄λ„ˆ 유리 μ–΄λ¨Έλ‹˜ λ“± λͺ¨λ‘κ°€ ν•œ κ°€μ‘±μ²˜λŸΌ μ‚΄μ•„κ°€κ³  μžˆλ‹€. 그러던 μ–΄λŠ λ‚ 

www.acmicpc.net

 

풀이

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);
    }
}

 

κ²°κ³Ό

 

    'πŸ‘¨πŸ»‍πŸ’» PS/바킹독' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 13168번 【G3.λ‚΄μΌλ‘œ 여행】
    • [JAVA] λ°±μ€€ 2637번 【G2.μž₯λ‚œκ° 쑰립】
    • [JAVA] λ°±μ€€ 1967번 【G4.트리의 지름】
    • [JAVA] λ°±μ€€ 2250번 【G2.트리의 높이와 λ„ˆλΉ„γ€‘
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”