1️⃣ 문제

2️⃣ 풀이 방법

괄호가 있어서 처음에는 스택 문제인 줄 알았는데, 그렇게 해도 풀이는 되긴 하지만, 괄호가 복잡하지 않아서 충분히 문자열 처리해서 풀 수 있던 문제였다!

  1. 괄호랑 쉼표 없애서 숫자 원소만 남기기
  2. 숫자 빈도 수에 따른 딕셔너리 생성
  3. 빈도 수 높은 순대로 숫자 answer에 저장하면 튜플 완성!

3️⃣ 코드

import Foundation

func solution(_ s:String) -> [Int] {
    var sArray = s
    
    // 1. 특수문자 필터링
    sArray.removeFirst(2)
    sArray.removeLast(2)
    let elements = sArray.components(separatedBy: "},{").flatMap {
        $0.components(separatedBy: ",").map { Int($0)! }
    }
    
    // 2. 딕셔너리에 숫자에 따른 빈도 수 저장
    let numDict = elements.reduce(into: [:], { $0[$1, default: 0] += 1})
    
    // 3. 빈도수 기준 내림차순하여 키값을 Int로 변환하여 튜플 저장
    let answer = numDict.sorted { $0.value > $1.value }.map { $0.key }
    
    
    return answer
}

4️⃣ 이 문제를 풀면서 되새긴 점

.split과 .components는 반환 타입이 다르다.

var s = ""
s.split(separator: " ") // 반환 타입: [String.element] (String.element = Character)
s.components(separatedBy: " ") // 반환 타입: [String]

flatMap()

다차원 배열을 1차원으로 펼쳐줌.

let numbers = [1, 2, 3, 4]

let mapped = numbers.map { Array(repeating: $0, count: $0) }
// [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]