[dailycoding] 위장

[dailycoding] 위장

문제

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 ‘_’ 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

입출력 예

clothes return
[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] 5
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] 3

해결의 과정
문제는 단순히 수학문제에서 마주할 수 있는 조합의 문제이다.
옷의 종류가 a,b,c가 있다면
abc가지가 있다. 하지만 옷을 입지 않은 가짓수도 있기 때문에
(a+1)(b+1)(c+1) 가지의 조합이 나온다.
마지막으로 하나도 입지 않은 가짓수는 제외해야하기 때문에
(a+1)(b+1)(c+1) - 1 을 계산한다.

입력 받은 옷 중에 같은 이름은 없기 때문에 결국 옷 종류별로 몇개씩 있는지만 고려하면된다.

  1. 옷 종류별로 몇벌씩 가지고있는지 계산한다.
  2. 종류별 옷을 전부 +1 한뒤 곱한다.
  3. 마지막에 -1을 해준다.
import Foundation

func solution(_ clothes:[[String]]) -> Int {
    var clothType : [String : Int] = [:]
    var answer = 1
    
    clothes.forEach {item in
        // 옷 종류별 갯수를 계산한다.
        if clothType.keys.contains(item[1]){
            clothType[item[1]]! += 1
        } else {
            clothType[item[1]] = 1
        }
    }

    // 옷 종류별로 + 1 해서 곱해준다.
    for item in clothType {
        answer *= item.value + 1
    }

    // 마지막에 -1 해준다.
    return answer - 1
}
  • 아쉬운 점
    • dictionary나 array에 구현된 함수를 사용하면, 성능을 늘릴 수 있을 것 같은데 찾아봐야겠다.
donaricano-btn

댓글

이 블로그의 인기 게시물

[IOS] AppDelegate는 뭐하는 녀석이지?

[git] Github 이슈 라벨(issue labels)

[git] git의 upstream과 origin 헷갈리는 사람 손!