itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 독립서점
  • ios
  • 어플
  • 킨디
  • 점주
  • AppleDevloperAcademy
  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • SWIFT
  • 생활코딩
  • CS
  • SwiftUI
  • 세그멘테이션
  • binding
  • POSTECH
  • mongodb
  • CoreData
  • nosql
  • crud
  • 연결리스트
  • 개발자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

[프로그래머스 - Swift] 네트워크
PS

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

2023. 2. 20. 19:25

문제

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

 

프로그래머스

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

programmers.co.kr

 

풀이

DFS by 재귀

맨 처음엔 간선만 신경을 썼으나, 문제에서 요구하는 '네트워크의 수'는 간선과 아무것도 연결되어있지 않는 노드도 신경을 써서 도출해야 했다.

dfs로 재귀를 통해 연결되어있는 노드를 탐색하면, 연결되어 있는 노드를 끝까지 탐색하도록 했다. 이때 탐색했다는 표시도 동시에 해서 최종적으로 탐색되지 않은 (아무것도 연결되어있지 않은) 노드의 개수를 구할 수 있도록 했다.

간선의 개수는 처음 dfs가 시작되는 시점에 count+1을 해주었다. (재귀적으로 몇 번 들어가는 것과 상관없이 하나의 네트워크를 탐색하기 때문)

 

괜히 복잡하게 푼 것 같다. 정답부터 맞히려는 탓에 효율적으로 못 짠 부분이 많이 보인다.

몇 달 전에 시도했다가 결국 못 풀었던 문제인데, 문제를 맞히니 그래도 공부한 보람이 있구나 싶었다. (사실 DFS의 기본 유형인 것 같긴 하다.) 꾸준히 기초를 더 공부해야겠다.

 

코드

func solution(_ n:Int, _ computers:[[Int]]) -> Int {
    func dfs(_ current: (Int,Int)) {
        graph[current.0][current.1] = 0
        graph[current.1][current.0] = 0
        
        for k in 0..<n {
            if graph[current.1][k] == 1 {
                computer[current.1] = true
                computer[k] = true
                dfs((current.1,k))
            }
        }
    }
    
    var graph = computers, network = 0, computer = [Int: Bool]()
    for i in 0..<n {
        computer[i] = false
    }
    
    for i in 0..<n {
        graph[i][i] = 0
    }
    
    for i in 0..<n {
        for j in 0..<n {
            if graph[i][j] == 1 {
                network += 1
                computer[i] = true
                computer[j] = true
                dfs((i,j))
            }
        }
    }
    
    return network + computer.filter{ $0.value == false }.count
}
저작자표시 (새창열림)

'PS' 카테고리의 다른 글

[알고리즘 - Swift] 순열과 조합 구현하기  (0) 2023.04.01
[프로그래머스 - Swift] 가장 먼 노드  (0) 2023.02.21
[Leetcode - Swift] 841. Keys and Rooms  (0) 2023.02.20
[PS] 간단한 Graph 개념과 BFS, DFS 템플릿  (0) 2023.02.20
[Leetcode - Swift] 1091 Shortest Path in Binary Matrix  (0) 2023.02.18
    'PS' 카테고리의 다른 글
    • [알고리즘 - Swift] 순열과 조합 구현하기
    • [프로그래머스 - Swift] 가장 먼 노드
    • [Leetcode - Swift] 841. Keys and Rooms
    • [PS] 간단한 Graph 개념과 BFS, DFS 템플릿
    itisjustK
    itisjustK

    티스토리툴바