문제 보러 가기
문제
스파이들이 여러 종류의 옷들을 겹치지 않게 입으려고 한다.
각 종류당 하나의 옷을 입을 수 있고 입지 않는 종류가 있어도 괜찮다. 하지만 최소 한 개의 종류는 입어야 한다.
해결
Dictionary 만들기
의상 이름, 종류 순으로 String
배열이 들어오는데 총 조합의 개수만 알아내면 되므로 이름은 신경쓰지 않아도 된다. 같은 종류에 새로운 이름이 들어올 때마다 value
를 +1
해준다.
Dictionary
에 종류를key
, 개수를value
로 저장해준다.
경우의 수 구하기
어떤 수의 약수의 개수는 소인수분해 후 각 밑의 지수 + 1
끼리의 곱으로 구할 수 있다. 각 밑을 0번, 1번, 2번, … n번
사용해 수를 만들 수 있기 때문이다. 같은 원리를 사용한다.
한 종류 안에서 n
개의 이름이 들어왔다면 안 입기, 1번 이름 입기, 2번 이름 입기, … n번 이름 입기
라고 생각하면 한 종류당 n + 1
개의 경우의 수가 생긴다.
Dictionary
에서 value + 1
끼리의 곱을 구한다. 이때 모든 종류를 안 입는 경우는 빼줘야 한다.
Dictionary
를 순회하면서value + 1
을 곱한 후1
을 빼준다.value
는.value
로 접근할 수 있다.
코드
import Foundation
func solution(_ clothes:[[String]]) -> Int {
var dict = [String: Int]()
var ans = 1 // 곱할 거니까 0이 아닌 1부터 시작
for str in clothes {
if let cnt = dict[str[1]] {
dict[str[1]] = cnt + 1
} else {
dict[str[1]] = 1
} // 한 줄로 쓸 수 있을 거 같은데 모르겠다ㅠㅠ
}
for i in dict {
ans *= i.value + 1
}
return ans - 1
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스] (Swift) 순위 (2) | 2022.11.16 |
---|---|
[LeetCode] (Swift) 13. Roman to Integer (0) | 2022.09.14 |
[백준] (Swift) 2675 문자열 반복 (0) | 2022.07.11 |
[백준](Swift) 1차원 배열 (0) | 2022.06.04 |
[백준](Swift) 반복문 (0) | 2022.05.28 |
댓글