1️⃣ 문제
2️⃣ 풀이 방법
괄호가 있어서 처음에는 스택 문제인 줄 알았는데, 그렇게 해도 풀이는 되긴 하지만, 괄호가 복잡하지 않아서 충분히 문자열 처리해서 풀 수 있던 문제였다!
- 괄호랑 쉼표 없애서 숫자 원소만 남기기
- 숫자 빈도 수에 따른 딕셔너리 생성
- 빈도 수 높은 순대로 숫자 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]