Algorithm / 의상

알고리즘 코드카타

목록 보기
42/59
post-thumbnail

문제

프로그래머스 / 의상

1) 문제 풀이

  • 각 카테고리별로 최대 1개씩 아이템을 사용
  • 아이템을 사용하지 않는 경우도 고려
  • 모든 아이템을 사용하지 않는다는 것은 없기 때문에, 최소 1개의 아이템을 사용한다고 가정
  • 수식:
    • 경우의 수 x = (AItems.count + 1) * (BItems.count + 1)... * (NItem.count + 1) - 1
    • 항목별 아이템의 수 + 아이템을 사용하지 않는 경우의 수
    • 아이템을 전부 착용하지 않는 경우는 없기 때문에 -1
func solution(_ clothes:[[String]]) -> Int {
    var dic: [String:Int] = [:]
    var answer: Int = 1
    
    for i in clothes {
        let category = i.last ?? ""
        let clothe = i.dropLast()
        dic[category, default: 0] += clothe.count
    }
    
    for j in dic.values {
        answer *= (j + 1)
    }
    
    return answer - 1
}

결과

2) 코드 개선

⚠️ 문제점

  • clothe = i.dropLast() 의 비효율성
    • clothe는 항상 길이가 1인 배열이 되므로 dropLast()를 사용하는 것은 비효율적
    • category = i[1]으로 수정하는 것이 더욱 효율적임
  • 가독성이 떨어지는 네이밍
    • clothes, clothe가 섞여 혼란을 초래
    • 의미가 명확하게 전달되도록 변수 명 수정 필요

✅ 개선된 코드

func solution(_ clothes:[[String]]) -> Int {
    var categoryCount: [String: Int] = [:]
    
    for item in clothes {
        let category = item[1]
        categoryCount[category, default: 0] += 1
    }
    
    var combinations = 1
    for count in categoryCount.values {
        combinations *= (count + 1)
    }
    
    return combinations - 1
}

결과

profile
이유있는 코드를 쓰자!!

0개의 댓글