[dailycoding] 위장
문제
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 ‘_’ 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예
clothes | return |
---|---|
[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] | 5 |
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] | 3 |
해결의 과정
문제는 단순히 수학문제에서 마주할 수 있는 조합의 문제이다.
옷의 종류가 a,b,c가 있다면
abc가지가 있다. 하지만 옷을 입지 않은 가짓수도 있기 때문에
(a+1)(b+1)(c+1) 가지의 조합이 나온다.
마지막으로 하나도 입지 않은 가짓수는 제외해야하기 때문에
(a+1)(b+1)(c+1) - 1 을 계산한다.
입력 받은 옷 중에 같은 이름은 없기 때문에 결국 옷 종류별로 몇개씩 있는지만 고려하면된다.
- 옷 종류별로 몇벌씩 가지고있는지 계산한다.
- 종류별 옷을 전부 +1 한뒤 곱한다.
- 마지막에 -1을 해준다.
import Foundation
func solution(_ clothes:[[String]]) -> Int {
var clothType : [String : Int] = [:]
var answer = 1
clothes.forEach {item in
// 옷 종류별 갯수를 계산한다.
if clothType.keys.contains(item[1]){
clothType[item[1]]! += 1
} else {
clothType[item[1]] = 1
}
}
// 옷 종류별로 + 1 해서 곱해준다.
for item in clothType {
answer *= item.value + 1
}
// 마지막에 -1 해준다.
return answer - 1
}
- 아쉬운 점
- dictionary나 array에 구현된 함수를 사용하면, 성능을 늘릴 수 있을 것 같은데 찾아봐야겠다.
댓글
댓글 쓰기