문제
프로그래머스 / 의상
1) 문제 풀이
- 각 카테고리별로 최대 1개씩 아이템을 사용
- 아이템을 사용하지 않는 경우도 고려
- 모든 아이템을 사용하지 않는다는 것은 없기 때문에, 최소 1개의 아이템을 사용한다고 가정
- 수식:
- 경우의 수
x = (AItems.count + 1) * (BItems.count + 1)... * (NItem.count + 1) - 1
- 항목별 아이템의 수 + 아이템을 사용하지 않는 경우의 수
- 아이템을 전부 착용하지 않는 경우는 없기 때문에 -1
func solution(_ clothes:[[String]]) -> Int {
var dic: [String:Int] = [:]
var answer: Int = 1
for i in clothes {
let category = i.last ?? ""
let clothe = i.dropLast()
dic[category, default: 0] += clothe.count
}
for j in dic.values {
answer *= (j + 1)
}
return answer - 1
}
결과

2) 코드 개선
⚠️ 문제점
clothe = i.dropLast() 의 비효율성
clothe는 항상 길이가 1인 배열이 되므로 dropLast()를 사용하는 것은 비효율적
category = i[1]으로 수정하는 것이 더욱 효율적임
- 가독성이 떨어지는 네이밍
clothes, clothe가 섞여 혼란을 초래
- 의미가 명확하게 전달되도록 변수 명 수정 필요
✅ 개선된 코드
func solution(_ clothes:[[String]]) -> Int {
var categoryCount: [String: Int] = [:]
for item in clothes {
let category = item[1]
categoryCount[category, default: 0] += 1
}
var combinations = 1
for count in categoryCount.values {
combinations *= (count + 1)
}
return combinations - 1
}
결과
