티스토리 뷰

Algorithm/Programmers

고득점Kit 해시 위장 Level2

malrang-malrang 2022. 8. 10. 19:11

조합의 갯수를 계산하는 문제.

스파이가 가진 의상들이 담긴 2차원 배열 clothes는 [의상의 이름, 의상의 종류] 형태로 되어있다.
여기서 의상의 이름은 중복되지 않고, 의상의 종류는 중복될 수 있다.

조합의 가짓수 를 계산하는 공식은 의상의 종류 A, B, C가 있을때 A, B, C 각각 +1 해준뒤 곱하기를 해주면된다.
하지만 아무것도 입지 않는것은 제외이므로 최종 공식은 (A+1) * (B+1) * (C+1) -1 이된다.

문제

func solution(_ clothes:[[String]]) -> Int {
    return 0
}

인자값으로 String값을 갖는 2차원 배열을 받는다.
인자값의 예시는 다음과 같다.

let clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]

위의 clothes가 인자값으로 전달되면 조합의 가짓수를 계산해 반환해주면된다.

풀이

import Foundation

func solution(_ clothes:[[String]]) -> Int {
    var clothesDictionary: [String: Int] = [:]
    clothes.forEach { clothe in
        if !clothesDictionary.keys.contains(clothe[1]) {
            clothesDictionary.updateValue(1, forKey: clothe[1])
        } else {
            clothesDictionary[clothe[1]]! += 1
        }
    }
    let valuse = clothesDictionary.values.map { $0 + 1 }
    return valuse.reduce(1) { $0 * $1 } - 1
}

먼저, [의상의 종류(String): 의상의 개수(Int)] 형태로 딕셔너리를 만들었다.
의상의 종류에 몇개를 보유하고 있는지 알기 위함이다.

의상의 이름은 중복되지 않으므로 개수만 세면 된다.
인자로들어온 clothes에 forEach를 사용했고 클로저 내부에서 clothesDictionary에 저장된 키와 일치하는것이 있는지 확인했다.
일치하는것이 없다면 clothesDictionary에 의상의 종류를 Key값으로, 갯수를 1로 넣어주었다.
일치하는것이 있다면 Key에 해당하는 Value를 +1 해주었다.
반복문을 돌면서 의상의 종류를 확인하고 의상의 개수를 증가시키는 로직이다.

그렇다면 이제 clothesDictionary에는 의상의 종류와 종류에 해당하는 개수가 담겨져있다.
이녀석으로 위의 공식대로 계산한후 반환해주면된다!

clothesDictionary 각각의 value에 +1을 해주었고 reduce를 활용해 곱해준뒤 -1 해주었다.

'Algorithm > Programmers' 카테고리의 다른 글

고득점Kit 해시 베스트앨범 Level3  (0) 2022.08.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함