[DFS] 백준 9466번: 텀 프로젝트(Swift)

2022. 12. 3. 22:04·코테

https://www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을

www.acmicpc.net

난이도

골드 3

사용언어

Swfit

카테고리

DFS

풀이과정

텀 프로젝트 문제는 원형 트리가 생기면 그 노드끼리 팀이 형성되고, 최종적으로 팀에 속하지 못한 노드의 수를 구하는 문제이다.

문제의 핵심은 사이클이 형성된 노드의 개수를 구하는 것이다.
(사이클이 형성됐다. == 특정 노드가 2번 탐색되었다.)

때문에 visited 배열 변수를 두어 탐색이 된 노드인지 아닌지 판별한다.

탐색되지 않은 노드이면, 탐색을 이어가고, 이미 탐색이 된 노드이면, 사이클이 형성되었기 때문에 사이클에 포함 되는 노드의 수를 계산해 준다.

(예를들어, 1->2->3->4->1 => 1, 2, 3, 4가 한팀이 된다. 때문에 count = 4)

또한, 이미 팀이 형성된 노드거나, 팀에 포함되지 못한 노드는 두 번 탐색할 필요가 없기 때문에, done 배열 변수를 두어 중복 탐색되는 것을 막아 시간 복잡도를 낮춰줄 수 있다.

때문에 if OR else if 로직이 끝나고 해당 노드의 done값에 true를 저장한다.

Code
let t = Int(readLine()!)!
var results = [Int]()

for _ in 0..<t {
  let r = Int(readLine()!)!

  let choice = [0] + readLine()!.split(separator: " ").map { Int($0)! }
  
  if choice == Array(0...r) {
    results.append(0)
    continue
  }
  
  var visited = Array(repeating: false, count: r + 1)
  var done = Array(repeating: false, count: r + 1)
  var count = 0

  func dfs(start: Int) {
    visited[start] = true
    var n = choice[start]
    
    if !visited[n] {
      dfs(start: n)
    } else if !done[n] {
      while n != start {
        count += 1
        n = choice[n]
      }
      count += 1
    }
    done[start] = true
  }

  for i in 1...r {
    if !visited[i] {
      dfs(start: i)
    }
  }
  results.append(r - count)
}

results.forEach {
  print($0)
}

'코테' 카테고리의 다른 글

[완전 탐색] 백준 브론즈2 2231번: 분해합(Swift)  (0) 2023.05.12
[구현 + 시뮬레이션] 백준 2578번: 빙고  (0) 2023.05.08
[DFS] 백준 1068번: 트리(Swift)  (0) 2022.11.18
[BFS + 구현] 백준 2573번: 빙산  (0) 2022.11.14
[DFS] 백준 1707번: 이분 그래프(Swift)  (0) 2022.11.11
'코테' 카테고리의 다른 글
  • [완전 탐색] 백준 브론즈2 2231번: 분해합(Swift)
  • [구현 + 시뮬레이션] 백준 2578번: 빙고
  • [DFS] 백준 1068번: 트리(Swift)
  • [BFS + 구현] 백준 2573번: 빙산
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    브루트포스 알고리즘
    알고리즘
    실버
    Combine
    BFS
    챌린지
    dfs
    구현
    회고
    ios
    완전탐색
    이분탐색
    비동기
    photoUI
    네부캠
    다이나믹 프로그래밍
    코테
    노드
    동시성
    그리디
    Swift
    Race Condition
    PhotoKit
    photos
    백준
    GCD
    탐색
    Property wrapper
    재귀
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[DFS] 백준 9466번: 텀 프로젝트(Swift)
상단으로

티스토리툴바