[Swift] [31일차] 의상

·2025년 1월 7일
0

SwiftAlgorithm

목록 보기
34/105
post-thumbnail

programmers-의상

문제설명

  1. 종류 별로 옷을 입을 건데 한 번에 한종류당 최대 한개 입을 수 있음
  2. 총 경우의 수를 구해라 ~

문제접근

  1. 문제 자체는 간단하다고 느꼈고, 종류가 4개인점을 잘 파고들면 될 것 같았다.
  2. 순서는 상관없으니 약간 조합으로다가 접근하면 좋을 것 같은데..
    사진으로 정리하면 다음과 같았다. 먼저 종류가 몇개있는지 파악하고, 그거에 따라서 경우의 수를 구해주면 될듯?

문제 풀이

  1. 일단 종류별로 묶어줬다.
var dict = [String: Int]()
    clothes.map {
        for (i, v) in $0.enumerated() {
            if i == 1 {
                dict[v, default: 0] += 1
                answer += 1 // 한벌씩만 걸쳤을 때 미리 계산
            }
        }
    }
    // ["eyewear": 1, "headgear": 2]

이런식으로 찍히게 해줬다. 어처피 모자인게 중요하지 모자의 생김새가 중요한 것은 아니라서 이것을 개수로 바꿔줬다.

  1. 그런데 이제 계산을 하다보니 , 이게 2개일때는 (모자,상의),(상의,하의),(모자,하의)이런식으로 조합을 뽑아줘야했는데 그쪽으로 고민을하다가 이게 일반적인 조합이 아니라 옷이 구분되어 있으니까 좀 다르게 풀어야하지 않나?하고 고민을 좀 거친 것 같다. 그래서 생각해낸게.. 이제 각자 1벌씩 입는거를 체크하겠다고 모든 개수를 더해주는게 아니라 반대로, 각각에서 안입었을때의 투명옷을 카테고리 개수에 추가하는 것이었다.
    for item in category_arr {
        answer = answer * (dict[item]! + 1)
    }

그래서 이런식으로 이걸 다 투명옷 포함해서 곱해주면 경우의 수가 나오고, 여기서 올투명한것 하나만 제거해주면 정답이 나오는 것이다. 급전개로 이렇게 풀수가 있었다.

채점 결과

정확성: 100.0
합계: 100.0 / 100.0


최종코드

import Foundation

func solution(_ clothes: [[String]]) -> Int {
    var answer = 1
    var dict = [String: Int]()
    var category_arr = [String]()
    clothes.map {
        for (i, v) in $0.enumerated() {
            if i == 1 {
                dict[v, default: 0] += 1
                if dict[v] == 1 {
                    category_arr.append(v)
                }
            }
        }
    }

    for item in category_arr {
        answer = answer * (dict[item]! + 1)
    }
    return answer - 1
}

타인의 코드

import Foundation

func solution(_ clothes:[[String]]) -> Int {
    let types = clothes.compactMap({ $0.last })
    let typeSet = Set(types)
    let categories = Array(typeSet)

    let counts = categories.map({ category in
        return clothes.filter({ $0.last == category }).count + 1
    })

    return counts.reduce(1,  { $0 * $1 }) - 1
}
  1. 카테고리는 뒤에 있어서 이걸 인덱스1로 해줬는데 last로 뽑아줬고 compactMap으로 옵셔널값이 안되게끔 해줬다.
  2. 이분도 동일하게 투명옷을 집어넣어서 경우의 수를 구한 것으로 보였다.
  3. 딱히 콤비네이션 활용해서 푸는 사람이 없었어서, 이게 이렇게 종류가 분리되어있는 경우에는 콤비네이션은 잘 스지 않는구나 알게되었다.

아쉬운데로 swift에서 그나마 쉽게 combination을 구현하는 방법을 찾아와봤다.

extension Set {
    func combinations(of count: Int) -> [[Element]] {
        Array(self).combinations(of: count)
    }
}
let items: Set = [1, 2, 3, 4]
let result = items.combinations(of: 2)
print(result) // 조합친것처럼 [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]

extension 사용해서 이렇게 조합친것처럼 활용을 할 수가 있다. 다른코드는 많이 길어지고 복잡해서 다음에 한 번에 알아보도록하고, 이번에 얻어갈거는 이정도로 추릴 수 있을 것 같다.

profile
기억보단 기록을

0개의 댓글