본문 바로가기
Swift랑 친해지기/programmers 풀기

[프로그래머스] 네트워크 (Swift)

by 데브킹덕 2023. 12. 19.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

  • comupters는 나를 포함하여 연결된 컴퓨터정보임
  • 나를 제외한 연결된 노드들을 담는 nodeDic을 생성
  • nodeDIc 구조는 [A:[A와 연결된 노드들]] 
  • 시작점을 바꿔가며 DFS를 이용하여 값이 다른(연결되지 않은) 부분들을 찾으려고 함 
 

DFS

깊이 우선 탐색(DFS) Depth-First Search 탐색하려는 노드의 자식 노드부터 우선 탐색하는 방식 한개의 큐와 한개의 스택으로 구현 방문해야하는 노드 저장 스택(LIFO) 이미 방문한 노드를 저장하는 큐 (

01pkd95.tistory.com

import Foundation

func solution(_ n:Int, _ computers:[[Int]]) -> Int {
    
    var nodeDic = [Int:[Int]]() // 인접한 노드들을 가지는 딕셔너리
    
    for i in 0..<computers.count{
        var arr = [Int]()
        for j in 0..<computers[i].count{
            if computers[i][j] == 1 && i != j{
                arr.append(j)
            }
        }
        nodeDic[i] = arr
    }
    //nodeDic 데이터 저장
    
    var network = [[Int]]()
    
    for i in 0..<n{
        let arr = dfs(dic: nodeDic, start: i).sorted(by: <)
        if !network.contains(arr){
            network.append(arr)
        }
    }
    return network.count
}

func dfs(dic: [Int:[Int]], start: Int) -> [Int]{
    var queue = [Int]()
    var stack = [start]
    
    while !stack.isEmpty{
        let node = stack.removeLast()
        if queue.contains(node){ continue}
        
        queue.append(node)
        stack += dic[node] ?? []
    }
    return queue
}