[C#] 네트워크

소슬잎·2023년 11월 6일

프로그래머스 문제

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

풀이 후기

1. 분석

노드 하나 잡고 탐색하고, 방문 안한 노드 잡고 탐색하고... 탐색이 끝날 때 마다 정답 횟수만 카운팅 해주면 된다.

어려울건 없는데 방향 그래프인지 알고 삽질에, 방문 배열 체크하는거 까먹어서 시간을 좀 많이 썼다.

2. 실행 결과

3. 코드

using System;
using System.Linq;
using System.Collections.Generic;

public class Solution {
    public class Node {
        public int index;
        HashSet<int> edges = new HashSet<int>();
        
        public Node(int i){
            index = i;
        }
        
        public void AddEdge(int n){
            edges.Add(n);
        }
        
        public int[] GetEdges(){
            return edges.ToArray();
        }
    }
    
    public int solution(int n, int[,] computers) {
        var nodes = new Node[n];
        var visited = new bool[n];
        var visitCount = 0;
        var groupCount = 0;
        
        for(int x = 0; x < n; x++){
            for(int y = 0; y < n; y++){
                if(nodes[x] == null){
                    nodes[x] = new Node(x);
                }
                
                if(nodes[y] == null){
                    nodes[y] = new Node(y);
                }
                
                if(computers[x, y] == 1){
                    nodes[x].AddEdge(y);
                }
            }
        }
        
        Queue<Node> nextNodes = new Queue<Node>();
        nextNodes.Enqueue(nodes[0]);
        visited[0] = true;
        
        while(visitCount < n){
            var node = nextNodes.Dequeue();
            var edges = node.GetEdges();
            visitCount++;

            for(int i = 0; i < edges.Length; i++){
                var target = edges[i];
                if(visited[target] == false){
                    visited[target] = true;
                    nextNodes.Enqueue(nodes[edges[i]]);
                }
            }

            if(nextNodes.Count == 0){
                for(int i = 0; i < n; i++){
                    if(visited[i] == false){
                        visited[i] = true;
                        nextNodes.Enqueue(nodes[i]);
                        break;
                    }
                }
                groupCount++;
            }
            
        }
        
        return groupCount;
    }
}

너무 어렵게 푼거같음.

profile
그냥 바보

0개의 댓글