πŸ”₯[99클럽 μ½”ν…Œ μŠ€ν„°λ””] 36일차 TIL - μ „λ ₯망을 λ‘˜λ‘œ λ‚˜λˆ„κΈ°

HOONSSACΒ·2024λ…„ 8μ›” 26일
1

99Club Coding Test Study

λͺ©λ‘ 보기
36/41
post-thumbnail

⏳문제

n개의 솑전탑이 전선을 톡해 ν•˜λ‚˜μ˜ 트리 ν˜•νƒœλ‘œ μ—°κ²°λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 당신은 이 μ „μ„ λ“€ 쀑 ν•˜λ‚˜λ₯Ό λŠμ–΄μ„œ ν˜„μž¬μ˜ μ „λ ₯망 λ„€νŠΈμ›Œν¬λ₯Ό 2개둜 λΆ„ν• ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μ΄λ•Œ, 두 μ „λ ₯망이 κ°–κ²Œ λ˜λŠ” μ†‘μ „νƒ‘μ˜ 개수λ₯Ό μ΅œλŒ€ν•œ λΉ„μŠ·ν•˜κ²Œ λ§žμΆ”κ³ μž ν•©λ‹ˆλ‹€.

μ†‘μ „νƒ‘μ˜ 개수 n, 그리고 μ „μ„  정보 wiresκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ „μ„ λ“€ 쀑 ν•˜λ‚˜λ₯Ό λŠμ–΄μ„œ 솑전탑 κ°œμˆ˜κ°€ κ°€λŠ₯ν•œ λΉ„μŠ·ν•˜λ„λ‘ 두 μ „λ ₯망으둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ, 두 μ „λ ₯망이 가지고 μžˆλŠ” 솑전탑 개수의 차이(μ ˆλŒ€κ°’)λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

πŸš¨μ œν•œ 사항

  • n은 2 이상 100 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • wiresλŠ” 길이가 n-1인 μ •μˆ˜ν˜• 2차원 λ°°μ—΄μž…λ‹ˆλ‹€.
  • wires의 각 μ›μ†ŒλŠ” [v1, v2] 2개의 μžμ—°μˆ˜λ‘œ 이루어져 있으며, μ΄λŠ” μ „λ ₯망의 v1번 솑전탑과 v2번 솑전탑이 μ „μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • 1 ≀ v1 < v2 ≀ n μž…λ‹ˆλ‹€.
  • μ „λ ₯망 λ„€νŠΈμ›Œν¬κ°€ ν•˜λ‚˜μ˜ 트리 ν˜•νƒœκ°€ μ•„λ‹Œ κ²½μš°λŠ” μž…λ ₯으둜 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ“ƒμž…μΆœλ ₯ 예

nwiresresult
9[[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]]3
[[1,2],[2,3],[3,4]]0
7[[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]]1

μž…μΆœλ ₯ 예 #1

  • λ‹€μŒ 그림은 주어진 μž…λ ₯을 ν•΄κ²°ν•˜λŠ” 방법 쀑 ν•˜λ‚˜λ₯Ό λ‚˜νƒ€λ‚Έ κ²ƒμž…λ‹ˆλ‹€.

  • 4번과 7λ²ˆμ„ μ—°κ²°ν•˜λŠ” 전선을 끊으면 두 μ „λ ₯망은 각 6κ°œμ™€ 3개의 솑전탑을 가지며, 이보닀 더 λΉ„μŠ·ν•œ 개수둜 μ „λ ₯망을 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.

  • 또 λ‹€λ₯Έ λ°©λ²•μœΌλ‘œλŠ” 3번과 4λ²ˆμ„ μ—°κ²°ν•˜λŠ” 전선을 λŠμ–΄λ„ μ΅œμ„ μ˜ 정닡을 λ„μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • λ‹€μŒ 그림은 주어진 μž…λ ₯을 ν•΄κ²°ν•˜λŠ” 방법을 λ‚˜νƒ€λ‚Έ κ²ƒμž…λ‹ˆλ‹€.

  • 2번과 3λ²ˆμ„ μ—°κ²°ν•˜λŠ” 전선을 끊으면 두 μ „λ ₯망이 λͺ¨λ‘ 2개의 솑전탑을 κ°€μ§€κ²Œ 되며, 이 방법이 μ΅œμ„ μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • λ‹€μŒ 그림은 주어진 μž…λ ₯을 ν•΄κ²°ν•˜λŠ” 방법을 λ‚˜νƒ€λ‚Έ κ²ƒμž…λ‹ˆλ‹€.

  • 3번과 7λ²ˆμ„ μ—°κ²°ν•˜λŠ” 전선을 끊으면 두 μ „λ ₯망이 각각 4κ°œμ™€ 3개의 솑전탑을 κ°€μ§€κ²Œ 되며, 이 방법이 μ΅œμ„ μž…λ‹ˆλ‹€.


βœοΈν’€μ΄

이 λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” 것은 λŠμ€ 전선을 κΈ°μ€€μœΌλ‘œ λ‚˜λˆ„μ–΄μ§„ 두 κ·Έλ£Ή μ•ˆμ—μ„œμ˜ 솑전탑 개수λ₯Ό 각각 νŒŒμ•…ν•΄ κ·Έ 차이가 μ΅œμ†Œκ°€ λ˜λŠ” 지점이닀.
λ”°λΌμ„œ λ‚˜λŠ” μ†‘μ „νƒ‘μ˜ 전선을 ν•˜λ‚˜μ”© λŠμ–΄λ³΄λ©΄μ„œ λ‚˜λˆ„μ–΄μ§„ 두 κ·Έλ£Ήμ•ˆμ—μ„œμ˜ 솑전탑 개수λ₯Ό 각각 BFSλ₯Ό 톡해 κ΅¬ν•΄λ³΄κΈ°λ‘œ ν•˜μ˜€λ‹€.

πŸ‘Ύμ΅œμ’… μ½”λ“œ

import java.util.*;

class Solution {
    static int[][] graph;
    static boolean[] visited;

    public static int solution(int n, int[][] wires) {
        int answer = wires.length;

        for (int i = 0; i < wires.length; i++) {
            graph = new int[n + 1][n + 1]; // κ·Έλž˜ν”„ μ΄ˆκΈ°ν™”
            visited = new boolean[n + 1]; // λ°©λ¬Έ μ—¬λΆ€ μ΄ˆκΈ°ν™”

            // 솑전탑 μ—°κ²° 정보 μ €μž₯
            for (int j = 0; j < wires.length; j++) {
                // i번째 연결을 μ œμ™Έν•˜κ³  μ €μž₯
                if (wires[j] != wires[i]) {
                    graph[wires[j][0]][wires[j][1]] = 1;
                    graph[wires[j][1]][wires[j][0]] = 1;
                }
            }

            // 두 개의 μΆœλ°œμ§€λ‘œ λ‚˜λˆ„κΈ°
            int start1 = wires[i][0]; // 첫 번째 μΆœλ°œμ§€
            int start2 = wires[i][1]; // 두 번째 μΆœλ°œμ§€
            
            int sum1 = bfs(start1, n); // 첫 번째 솑전탑 개수
            int sum2 = bfs(start2, n); // 두 번째 솑전탑 개수

            // sum1 - sum2 μ΅œμ†Œκ°’ μ—…λ°μ΄νŠΈ
            if (answer > Math.abs(sum1 - sum2)) {
                answer = Math.abs(sum1 - sum2);
            }

        }
        return answer;
    }

	// bfs
    public static int bfs(int start, int n) {
        Queue<Integer> queue = new LinkedList<>(); // bfsλ₯Ό μœ„ν•œ 큐 생성
        queue.offer(start); // μ‹œμž‘μ 
        visited[start] = true; // λ°©λ¬Έ μ—¬λΆ€
        int count = 1; // μ‹œμž‘ 솑전탑 포함

        while (!queue.isEmpty()) {
            int current = queue.poll();
            for (int i = 1; i <= n; i++) {
                if (graph[current][i] == 1 && !visited[i]) {
                    visited[i] = true;
                    queue.offer(i);
                    count++;
                }
            }
        }
        return count;
    }
}

πŸ‘»μ½”λ“œ μ„€λͺ…

  1. 솑전탑 μ—°κ²° 정보λ₯Ό μ €μž₯ν•œλ‹€.

  2. wires에 μ €μž₯λ˜μ–΄ μžˆλŠ” μ—°κ²° 정보 쀑 i번째 연결을 μ œμ™Έν•˜κ³  인접 ν–‰λ ¬ graph에 μ €μž₯ν•œλ‹€.

  3. μ œμ™Έν•œ μ—°κ²°μ˜ μ–‘ 끝 λ…Έλ“œλ₯Ό start1κ³Ό start2에 각각 μ €μž₯ν•œλ‹€.

  4. 두 λ…Έλ“œλ₯Ό κΈ°μ€€μœΌλ‘œ bfsλ₯Ό 각각 μˆ˜ν–‰ν•΄ 각 κ·Έλ£Ή μ•ˆμ— μžˆλŠ” μ†‘μ „νƒ‘μ˜ 개수λ₯Ό κ΅¬ν•œλ‹€.

  5. 두 그룹의 각 솑전탑 개수 sum1, sum2의 차이의 μ΅œμ†Œκ°’μ„ answer에 μ €μž₯ν•œλ‹€.


πŸ”—λ¬Έμ œ 링크
πŸ’»Repository

profile
ν›ˆμ‹Ήμ˜ κ°œλ°œμ—¬ν–‰

2개의 λŒ“κΈ€

comment-user-thumbnail
2024λ…„ 8μ›” 27일

γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹μ•„ μ € 지 또 봐도 웃기넀

1개의 λ‹΅κΈ€