딕셔너리 형태로 옷의 개수를 구하였다. 그 후 개수의 1씩 더한 값을 곱한 후 아무것도 없는 경우인 1을 빼 정답을 구했다. 딕셔너리인 clothDic는 아래와 같은 형태이다.
func solution(_ clothes:[[String]]) -> Int {
var clothDic : [String: Int] = [:]
for cloth in clothes {
if clothDic[cloth[1]] != nil {
clothDic[cloth[1]]! += 1
} else {
clothDic[cloth[1]] = 1
}
}
return clothDic.values.reduce(1) { ($0) * ($1 + 1) } - 1
}
clothDic = ["eyewear": 1, "headgear": 2]
다른 사람의 풀이를 참고하여 작성하였다. 내가 딕셔너리로 했던 것과는 반대로, 타입에 대한 배열과, 그 배열로 개수 배열을 따로 구해서 reduce로 답을 도출하였다.
func solution(_ clothes:[[String]]) -> Int {
let typeSet = Set(clothes.compactMap({ $0[1] }))
let counts = typeSet.map({ type in
return clothes.filter({ $0[1] == type }).count
})
return counts.reduce(1, {$0 * ($1 + 1)} ) - 1
}
compactMap은 1차원 배열인 경우 nil을 제거한다. 추가로 compactMaps는 flatMap과는 다르게 2차원 배열을 1차원 배열로 flatten하게 만들지 않는다.
let arr = [1, 2, nil, 4]
let mapArr = arr.map({ $0 }) // [Optional(1), Optional(2), nil, Optional(4)]
let compactMapArr = arr.compactMap({ $0 }) // [1, 2, 4]