[Swift] 백준 9375번: 패션왕 신혜빈
문제 사이트
9375번: 패션왕 신해빈
첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로 (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.
www.acmicpc.net
알고리즘
1. 테스트 케이스 입력받고, 반복문 수행
2. n 입력받기
3. n이 0일 경우, 0 출력 후 continue
이 코드 없으면 런타임에러나요!
4. n만큼 반복하며 Dictionary 입력받기 ( 키가 있는경우, 없는 경우 구분해서 받아야해요)
5. value + 1을 구하여 result_arr에 삽입
첫번째 키에 (A, B)라는 옷이 있을 때, A를 입을수도, B를 입을 수도, 둘 다 안입을 수도 있습니다.
둘 다 안 입을 경우도 고려하기 위해 +1 을 해줍니다.
6. result_arr에 존재하는 원소 곱한 후 -1
집합 A, B, C가 있을 때 {안입기, 안입기, 안입기} 라는 부분집합의 경우의 수 (1가지)를 빼주는 것입니다.
나의 코드
for _ in 0..<Int(readLine()!)!{ // testcase만큼 반복
var result_arr: [Int] = [] // 각 value + 1을 넣을 배열
var dic = [String: [String]]()
let n = Int(readLine()!)!
if n == 0{ // 이 코드 없으면 runtimeError 발생
print(0)
continue
}
for _ in 0..<n{ // n만큼 반복
let value: [String] = readLine()!.split(separator: " ").map{ String($0) }
if dic.keys.contains(value[1]){ // 이미 존재한다면
dic[value[1]]!.append(value[0]) // append
} else { // 없다면
dic[value[1]] = [value[0]] // key 생성
}
}
for (_, value) in dic{
result_arr.append(value.count + 1) // value의 길이 + 1을 삽입
}
print(mul(numbers: result_arr) - 1) // 각 값의 곱을 구한 후 -1 하여 출력
}
func mul(numbers: [Int]) -> Int{
numbers.reduce(1, *)
}
Key Point
📍 Dictionary 선언하기!
Dictionary를 [String: String] 으로 선언하면, value가 나누어지지 않습니다.
key = "value1value2value3" 이런식으로 나타남 -> [String:[String]] 으로 선언
📍Dictionary 입력하기!
Dictionary에 key가 존재하는지 확인하여 각각 다른 연산을 수행해야한다.
그렇지 않으면, 항상 값을 덮어쓰게 된다.
📍 reduce 이용하여 배열의 곱 구하기