๋ฌธ์ :
https://www.acmicpc.net/problem/9466
๋ถ์ :
ํ์๋ค์ด cycle์ ์ด๋ฃจ๋์ง ํ์ ํ๊ธฐ ์ํด DFS๋ก ์ ๊ทผํด์ผ ํ๋ค. ์ฒ์์ ์ ๊ทผํ ๋ฐฉ์์ while๋ฌธ์ ํตํด dfs ํ์์ ํ๊ณ ์ ํ์ง๋ง visit๋ฅผ ๊ฒ์ฌํด์ฃผ์ง ์์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. ๊ทธ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด ๋ค์ ํ์๋ค ใ
์ผ๋ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ ๋ ธ๋์ธ์ง ํ์ธ์ ์ํด visit๋ฐฐ์ด์ ์ฌ์ฉํ๋๋ฐ
์ฌ๊ธฐ์๋ done(ํ์ ์ด๋ฃจ์๋์ง ์๋์ง)๋ ๋ฐฐ์ด์ ํ๋ ์๋ก ๋ง๋ ๋ค. ๊ฐ์ด ํ๋ก์ ํธ ํ๊ณ ์ถ์ ์น๊ตฌ๊ฐ ๊ฒน์น ์ ์๊ธฐ ๋๋ฌธ์(ex> arr[1] : 3, arr[3] : 3, arr[5] = 3) visit๊ฐ true์ผ๋ done ๋ฐฐ์ด์ ํตํด ์ด๋ฏธ ํ ๋งค์นญ์ด ๋๋ฌ๋์ง ์๋์ง ํ์ธํด์ผ ํ๋ค.
๊ฐ๋จํ๊ฒ ์๊ฐํ๋๋ฐ ์๊ฐ๋ณด๋ค ์ฌ๊ท์ done ๋ฐฐ์ด๊น์ง ์์ด ์ถ์์ ์ด๊ณ ์ด๋ ต๊ฒ ๋๊ปด์ก๋ค ..
์๊ฐ์ด๊ณผ๋ ์ฝ๋ :
//
// main.swift
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2022/03/17.
//
import Foundation
var Tcase = Int(readLine()!)!
func dfs(_ arr:[Int]) -> Int {
var answer = 0
for (idx, i) in arr.enumerated() { // me, friend
var cnt = 0
let start = idx + 1
var friend = i
while(start != friend) {
if( friend == arr[friend-1]) {
break
}else {
friend = arr[friend-1]
//cnt += 1
}
}
if(start == friend){
cnt += 1
}else {
cnt = 0
}
answer += cnt
}
return arr.count - answer
}
for _ in 0..<Tcase {
var n = Int(readLine()!)!
var arr = readLine()!.split(separator: " ").map{ Int($0)!}
print(dfs(arr))
}
Swift ์ฝ๋ :
//
// main.swift
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2022/03/17.
//
import Foundation
var Tcase = Int(readLine()!)!
var visit: [Bool] = []
var done: [Bool] = [] //cycle์ ๊ฑฐ์น node์ธ์ง(ํ ๋งค์นญ์ ๊ฑฐ์น ๋
ธ๋์ธ์ง)
var cnt = 0
func dfs(_ arr:[Int], cur: Int) {
var nextNode = arr[cur]
visit[cur] = true
if !visit[nextNode] {
dfs(arr, cur: nextNode)
}else {
if !done[nextNode] { // cycle์ด ๋์๋๋ฐ ์์ง ํ ๋งค์นญ ๋์ง ์์๋ค๋ฉด
while nextNode != cur { // cycle ์น๊ตฌ๋ค ์ ์ฅ
cnt += 1
nextNode = arr[nextNode]
}
cnt += 1 // cur ์๊ธฐ ์นด์ด๋
}
}
done[cur] = true
}
for _ in 0..<Tcase {
let n = Int(readLine()!)!
var arr = readLine()!.split(separator: " ").map{ Int($0)!}
arr.insert(0, at: 0) //์๋ฏธ ์๋ ์ index 1๋ถํฐ ~ ๊ณ์ฐํ๊ธฐ ์ํด
cnt = 0
visit = Array(repeating: false, count: n+1)
done = Array(repeating: false, count: n+1)
for i in arr {
if !visit[i] {
dfs(arr, cur: i)
}
}
print(arr.count - cnt)
}
'Algorithm๐ฐ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1049 Swift ๊ธฐํ์ค Greedy (0) | 2022.04.13 |
---|---|
[๋ฐฑ์ค] Swift 20361 ์ผ์ฐ๋ ์ผ๋ฐ์๊พผ implementation (0) | 2022.04.12 |
[๋ฐฑ์ค] Swift 2529 ๋ถ๋ฑํธ backtracking (0) | 2022.04.07 |
[๋ฐฑ์ค] Swift 1300 k๋ฒ์งธ ์ BS(Bineary Search) (0) | 2022.03.31 |
[๋ฐฑ์ค] Swift 1806 ๋ถ๋ถํฉ ํฌํฌ์ธํฐ (0) | 2022.03.29 |
๋๊ธ