ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / μ „λ ₯망을 λ‘˜λ‘œ λ‚˜λˆ„κΈ°(C++)

2023. 4. 6. 12:15Β·πŸ–₯️ Study Note/Coding Test

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / λͺ¨μŒμ‚¬μ „(C++)

https://school.programmers.co.kr/learn/courses/30/lessons/86971

문제 μ„€λͺ…

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

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


μ œν•œμ‚¬ν•­

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

μž…μΆœλ ₯ 예

n wires  result
9 [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] 3
4 [[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개의 솑전탑을 κ°€μ§€κ²Œ 되며, 이 방법이 μ΅œμ„ μž…λ‹ˆλ‹€.

λ‚΄ ν•΄λ‹΅

#include <string>
#include <vector>
#include <iostream>

#define MAX 101 // n : 2 ~ 100

using namespace std;

int graph[MAX][MAX]{}; //  wires 값을 μ €μž₯
vector<bool> visited = vector<bool>(MAX, false);  //  솑전탑 λ°©λ¬Έ 체크 

int dfs(int cur, int n)
{
    // 이미 λ°©λ¬Έν•œ 솑전탑이라면 계산을 μ§„ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
    if(visited[cur]) return 0;
    
    int link = 1;           // μ—°κ²° 횟수
    visited[cur] = true;    // 방문 체크
    for(int i = 1; i <= n ; ++i)
    {
        if(graph[cur][i])
        {
            link += dfs(i, n);
        }
    }
    return link;
}

int solution(int n, vector<vector<int>> wires) {
    int answer = 102;
    
    // μ΄ˆκΈ°ν™” : 솑전탑 x, y κ°€ 쌍방 μ—°κ²°λ˜μ–΄ μžˆλ‹€λŠ” 것을 ν‘œμ‹œ
    for(int i = 0; i < wires.size(); ++i)
    {
        int x = wires[i][0];
        int y = wires[i][1];
        graph[x][y] = graph[y][x] = 1;
    }
    
    for(int i = 0; i < wires.size(); ++i)
    {
        // 간선을 ν•˜λ‚˜μ”© λŠμ–΄λ³Έλ‹€.
        int x = wires[i][0];
        int y = wires[i][1];
        graph[x][y] = graph[y][x] = 0;
        
        // λ°©λ¬Έ 체크 μ΄ˆκΈ°ν™”
        fill(visited.begin(),visited.end(),false);
        
        // 간선을 ν•˜λ‚˜μ”© λŠμ—ˆμ„ λ•Œ, μ—°κ²°λœ 솑전탑 수λ₯Ό μ €μž₯ν•  vector
        vector<int> linked_node;
        
        // μ—°κ²°λœ μ†‘μ „νƒ‘μ˜ 수λ₯Ό dfsλ₯Ό μ‚¬μš©ν•΄ κ³„μ‚°ν•œλ‹€.
        for(int i = 1; i <= n; ++i)
        {
            int link = dfs(i, n);
            if(!link)
                continue;
            
            linked_node.push_back(link);
        }
        
        // μ§€κΈˆκΉŒμ§€μ˜ 차이값과 ν˜„μž¬ 차이값 쀑에 더 μž‘μ€ μͺ½μ„ μ €μž₯ν•œλ‹€.
        int diff =  abs(linked_node[0]-linked_node[1]);
        answer = answer <= diff ? answer : diff;
        
        // 차이가 0μΌλ•Œκ°€ μ΅œμ„ μ˜ κ²°κ³Όμ΄λ―€λ‘œ 더 이상 κ³„μ‚°ν•˜μ§€ μ•ŠλŠ”λ‹€.
        if(answer == 0) break;
    
        // 간선을 λ‹€μ‹œ μ—°κ²°ν•œλ‹€.
        graph[x][y] = graph[y][x] = 1;
    }
    
    return answer;
}
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'πŸ–₯️ Study Note > Coding Test' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.3 / λ„€νŠΈμ›Œν¬(C++)  (0) 2023.04.10
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / νƒ€κ²Ÿ λ„˜λ²„(C++)  (0) 2023.04.07
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / λͺ¨μŒμ‚¬μ „(C++)  (0) 2023.04.05
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / λ””μŠ€ν¬ 컨트둀러(C++)  (0) 2023.04.04
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / 더 맡게(C++)  (0) 2023.04.02
'πŸ–₯️ Study Note/Coding Test' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.3 / λ„€νŠΈμ›Œν¬(C++)
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / νƒ€κ²Ÿ λ„˜λ²„(C++)
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / λͺ¨μŒμ‚¬μ „(C++)
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / λ””μŠ€ν¬ 컨트둀러(C++)
Beankong_
Beankong_
μ£Όλ‹ˆμ–΄ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž˜λ¨Έ 곡뢀 기둝
  • Beankong_
    Beankong's Devlog
    Beankong_
  • 전체
    였늘
    μ–΄μ œ
    • 전체 κΈ€ (146)
      • β›… Daily (0)
      • πŸ–₯️ Study Note (2)
        • C++ (1)
        • Unreal Engine (5)
        • Coding Test (123)
        • Design Patteren (5)
        • VCS (Git..) (1)
        • Server (1)
      • 🧭 Devlog (8)
        • μ˜€λ‹΅λ…ΈνŠΈ (4)
        • UE5 GameLift Server Test Project (1)
        • TIL (3)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
Beankong_
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / level.2 / μ „λ ₯망을 λ‘˜λ‘œ λ‚˜λˆ„κΈ°(C++)
μƒλ‹¨μœΌλ‘œ

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