hwangJi-dev/swiftAlgorithm

[Algorithm] ์ˆœ์œ„

hwangJi-dev opened this issue ยท 0 comments

๐Ÿ’ฌ ๋ฌธ์ œ

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


๐Ÿ’ฌ Idea

  • ์ด๊ธฐ๋Š” ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” winGraph์™€, ์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” loseGraph๋ฅผ ๊ฐ๊ฐ ๋งŒ๋“ ๋‹ค.
  • 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๊ฐ๊ฐ winGraph, loseGraph๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ด๊ธด ๊ฒฝ์šฐ์™€ ์ง„ ๊ฒฝ์šฐ์˜ ํƒ์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•œ๋‹ค.
  • ์ด๊ธด ๊ฒฝ์šฐ์™€ ์ง„ ๊ฒฝ์šฐ์˜ ํƒ์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณค์„ ๋•Œ 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋œ๋‹ค๋ฉด ์ˆœ์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ ค
    Set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Set(win + lose).count == n ์ด๋ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ’์— +1์„ ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿ’ฌ ํ’€์ด

import Foundation

func solution(n:Int, results:[[Int]]) -> Int {
    var loseGraph: [Int: [Int]] = [:]
    var winGraph: [Int: [Int]] = [:]
    var ans = 0
    
    for i in results {
        if loseGraph[i[1]] == nil {
            loseGraph[i[1]] = [i[0]]
        } else {
            loseGraph[i[1]]?.append(i[0])
        }
        
        if winGraph[i[0]] == nil {
            winGraph[i[0]] = [i[1]]
        } else {
            winGraph[i[0]]?.append(i[1])
        }
    }
    
    func dfs(_ isWin: Bool, _ start: Int) -> [Int] {
        var visitedQueue: [Int] = []
        var neetToVisitStack: [Int] = [start]
        
        while !neetToVisitStack.isEmpty {
            let node = neetToVisitStack.removeLast()
            
            if visitedQueue.contains(node) { continue }
            visitedQueue.append(node)
            
            if isWin {
                neetToVisitStack += winGraph[node] ?? []
            } else {
                neetToVisitStack += loseGraph[node] ?? []
            }
        }
        
        return visitedQueue
    }
    
    for i in 1...n {
        let win = dfs(true, i)
        let lose = dfs(false, i)
        
        if Set(win + lose).count == n {
            ans += 1
        }
    }
    
    return ans
}