https://school.programmers.co.kr/learn/courses/30/lessons/42578
의상이 종류별로 주어지는데, 주어진 의상을 조합하여 입을 수 있는 경우를 구하는 문제이다. 아무것도 안 입어서는 안되고, 같은 종류의 의상은 한번에 하나만 입을 수 있다는 전제 조건이 있다. 조건에 맞게 하나씩 문제를 해결해나가보도록 하겠다.
같은 종류의 의상은 동시에 입을 수 없다. 따라서 이름은 필요하지 않은 정보이고, 종류별 갯수만 세면 된다.
Map<String, Integer> kind = new HashMap<>();
for (int i = 0; i < clothes.length; i++) {
if (kind.containsKey(clothes[i][1])) {
kind.replace(clothes[i][1], kind.get(clothes[i][1]) + 1);
} else {
kind.put(clothes[i][1], 1);
}
}
Map을 사용하여 Key에는 의상 종류, value에는 갯수를 저장하였다.
종류와 갯수를 구하면, 총 경우의 수를 구하면 되는데, 아래 공식으로 간단하게 구할 수 있다.
+1을 해주는 이유는, 각각 하나의 의상만 착용했을 경우를 계산해주기 위함이고, 마지막에 -1을 해주는 이유는 아무것도 입지 않는 경우는 존재하면 안되기 때문이다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
Map<String, Integer> kind = new HashMap<>();
for (int i = 0; i < clothes.length; i++) {
if (kind.containsKey(clothes[i][1])) {
kind.replace(clothes[i][1], kind.get(clothes[i][1]) + 1);
} else {
kind.put(clothes[i][1], 1);
}
}
for (String key : kind.keySet()) {
answer *= kind.get(key) + 1;
}
return answer - 1;
}
}