알고리즘

위장

bakerlee 2021. 7. 17. 11:19

위장

https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

 

## 문제 설명 

 

[Value,Key] 형태의 배열이 주어진다.  조건에 맞추어 모든 경우의 수 를 구한다. 

 

### 문제 풀이 

 

문제의 답은 위장할 수 있는 모든 경우의 수를 열거하는 것이 아닌 모든 경우의 수만을 출력한다.

따라서 Key,Value는  <종류, 가짓수> 를 지정하며 Hash<String, Int> 타입으로 생성한다.  

 

모든 경우의 수는 모든 가짓수를 곱하는 것 이다. 

단, "해당문제의 조건 중 반드시 하나의 옷은 입어야 한다" 와 "어떤 종류의 옷은 입을 수 있지 않아도 된다."  2가지를 고려 해 주어야 한다. 

 

1. 옷을 입지 않을 수 있으니 가짓수 + 1(입지 않는 경우의 수)  를 해 주어야 하며 

2. 모두 입지 않는 경우의 수는 제외하기 위해 모든 경우의 수 - 1(아무것도 입지 않는 경우) 

가 필요하다.

 

문제 풀이는 2가지 단계로 나누어진다. 

 

1. 주어진 값을 문제 풀이를 위한 HashMap으로 가공한다. 

2. 가공된 값을 토대로 경우의 수를 구한다. 

 

 

1. 주어진 값 

class Solution {
fun solution(clothes: Array<Array<String>>): Int {
        var answer = 1
        val hash = hashMapOf<String,Int>()

        clothes.forEach {
            if(hash.containsKey(it[1])){
                hash.set( it[1] , hash.get(it[1])!! + 1 )
            } else{
                hash.set(it[1], 1)
            }
        }

        hash.values.forEach {
            answer *= it + 1
        }

        return answer - 1
    }
}

 

### 회고 

문제의 카테고리가 Hash인 것을 보고 해당 자료구조를 사용하여 풀었으나, 다른 사람들의 문제풀이를 보니 GroupBy를 사용하는 사람들이 많았다.  문제를 조금 더 단순화 하는 연습이 필요할 듯 한다.

'알고리즘' 카테고리의 다른 글

백준 1012 유기농 배추  (0) 2022.11.09
N으로 표현 kotlin  (0) 2021.07.31
1874번 스택 수열  (0) 2020.02.22
구명보트  (0) 2019.11.19
종이접기  (0) 2019.11.19