문제설명
- 종류 별로 옷을 입을 건데 한 번에 한종류당 최대 한개 입을 수 있음
- 총 경우의 수를 구해라 ~
문제접근
- 문제 자체는 간단하다고 느꼈고, 종류가 4개인점을 잘 파고들면 될 것 같았다.
- 순서는 상관없으니 약간 조합으로다가 접근하면 좋을 것 같은데..
사진으로 정리하면 다음과 같았다. 먼저 종류가 몇개있는지 파악하고, 그거에 따라서 경우의 수를 구해주면 될듯?
문제 풀이
var dict = [String: Int]()
clothes.map {
for (i, v) in $0.enumerated() {
if i == 1 {
dict[v, default: 0] += 1
answer += 1 // 한벌씩만 걸쳤을 때 미리 계산
}
}
}
// ["eyewear": 1, "headgear": 2]
이런식으로 찍히게 해줬다. 어처피 모자인게 중요하지 모자의 생김새가 중요한 것은 아니라서 이것을 개수로 바꿔줬다.
(모자,상의)
,(상의,하의)
,(모자,하의)
이런식으로 조합을 뽑아줘야했는데 그쪽으로 고민을하다가 이게 일반적인 조합이 아니라 옷이 구분되어 있으니까 좀 다르게 풀어야하지 않나?하고 고민을 좀 거친 것 같다. 그래서 생각해낸게.. 이제 각자 1벌씩 입는거를 체크하겠다고 모든 개수를 더해주는게 아니라 반대로, 각각에서 안입었을때의 투명옷을 카테고리 개수에 추가하는 것이었다. for item in category_arr {
answer = answer * (dict[item]! + 1)
}
그래서 이런식으로 이걸 다 투명옷 포함해서 곱해주면 경우의 수가 나오고, 여기서 올투명한것 하나만 제거해주면 정답이 나오는 것이다. 급전개로 이렇게 풀수가 있었다.
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
최종코드
import Foundation
func solution(_ clothes: [[String]]) -> Int {
var answer = 1
var dict = [String: Int]()
var category_arr = [String]()
clothes.map {
for (i, v) in $0.enumerated() {
if i == 1 {
dict[v, default: 0] += 1
if dict[v] == 1 {
category_arr.append(v)
}
}
}
}
for item in category_arr {
answer = answer * (dict[item]! + 1)
}
return answer - 1
}
타인의 코드
import Foundation
func solution(_ clothes:[[String]]) -> Int {
let types = clothes.compactMap({ $0.last })
let typeSet = Set(types)
let categories = Array(typeSet)
let counts = categories.map({ category in
return clothes.filter({ $0.last == category }).count + 1
})
return counts.reduce(1, { $0 * $1 }) - 1
}
- 카테고리는 뒤에 있어서 이걸 인덱스1로 해줬는데 last로 뽑아줬고 compactMap으로 옵셔널값이 안되게끔 해줬다.
- 이분도 동일하게 투명옷을 집어넣어서 경우의 수를 구한 것으로 보였다.
- 딱히 콤비네이션 활용해서 푸는 사람이 없었어서, 이게 이렇게 종류가 분리되어있는 경우에는 콤비네이션은 잘 스지 않는구나 알게되었다.
아쉬운데로 swift에서 그나마 쉽게 combination을 구현하는 방법을 찾아와봤다.
extension Set {
func combinations(of count: Int) -> [[Element]] {
Array(self).combinations(of: count)
}
}
let items: Set = [1, 2, 3, 4]
let result = items.combinations(of: 2)
print(result) // 조합친것처럼 [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
extension
사용해서 이렇게 조합친것처럼 활용을 할 수가 있다. 다른코드는 많이 길어지고 복잡해서 다음에 한 번에 알아보도록하고, 이번에 얻어갈거는 이정도로 추릴 수 있을 것 같다.