hwangJi-dev/swiftAlgorithm

[Algorithm] 혼자 놀기의 달인

Closed this issue · 0 comments

💬 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131130?language=swift


💬 Idea

  • cardDict에 순서 - 카드 숫자를 저장해놓는다.
  • 이후 첫번째 key부터 그룹지을 수 있는 만큼 (해당 숫자가 열려있을 때까지) 반복하면서 각 그룹을 찾아 ans에 그 개수를 저장한다.
  • ans를 내림차순 정렬한 뒤
    • 그룹 개수가 2개 이상이라면 최댓값, 그다음 최댓값을 곱한 숫자를 return한다
    • 그룹 개수가 2개 미만이라면 0을 return한다.

💬 풀이

import Foundation

func solution(_ cards:[Int]) -> Int {
    var cardDict: [Int: Int] = [:]
    
    for (idx, i) in cards.enumerated() {
        cardDict[idx + 1] = i
    }
    
    var ans: [Int] = []
    
    func cycle(_ start: Int) -> Int {
        var queue: [Int] = []
        var start = start
        
        while cardDict[start] != nil {
            let next = cardDict[start]!
            queue.append(start)
            cardDict.removeValue(forKey: start)
            start = next
        }
        
        return queue.count
    }
    
    while !cardDict.isEmpty {
        ans.append(cycle(cardDict.keys.first!))
    }

    ans = ans.sorted(by: >)
    
    return ans.count >= 2 ? ans[0] * ans[1] : 0
}