Swift 프로그래머스 의상 (해시)

YoungHyun Kim·2024년 7월 5일
0

매일매일 알고리즘

목록 보기
30/30

문제

코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.

예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트
  • 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
  • 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
  • 코니는 하루에 최소 한 개의 의상은 입습니다.

코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.


풀이

종류에 따라서 값들을 정리해야 된다.

  1. 정리를 편하게 하기 위해서, 입력받은 코니의 옷 리스트를 딕셔너리 형태로 가공한다.
  2. 조합할 수 있는 경우의 수를 계산해보자
    [모자 : [a, b, c] , 상의: [d, e] , 하의: [f, g, h, i]] 와 같은 딕셔너리로 정리가 되면, 조합할 수 있는 경우의 수는 (모자의 갯수 + 1) * (상의의 갯수 + 1) \* (하의의 갯수 + 1) - 1이다.

이러한 동작을 하는 코드를 작성하면 문제 해결!

import Foundation

func solution(_ clothes:[[String]]) -> Int {
    var sorted: [String: [String]] = [:]
    var count = 0
    var combination = 1
    
    for clothe in clothes {
        if sorted.keys.contains(clothe[1]) {
            sorted[clothe[1]]?.append(clothe[0])
        } else {
            sorted[clothe[1]] = [clothe[0]]
        }
    }
    for part in sorted {
        combination *= (part.value.count + 1)
        count += part.value.count
    }
    return combination - 1
}

어려웠던 점...

  1. 옷을 조합하는 경우의 수를 나타낼 수 있는 식을 세우는 데에서 좀 애를 먹었다...
    알고리즘은 수학도 잘해야 되는구나
profile
iOS 개발자가 되고 싶어요

0개의 댓글