[프로그래머스/42578] 의상
in Study / Coding Test
☑️ 문제
☑️ 풀이
- 처음에는 HashMap의 <
Key
,Value
>로 <이름
,종류
> 를 넣었다. 반복문을 돌면서 조합을 구해야 하는데 어떻게 해야 할 지 감이 잡히지 않았다.
첫 번째 풀이
- 질문하기에 올라온 힌트를 보니
HashMap
의Value
에는 다양한 데이터의 값이 들어올 수 있어서 <종류
,List<이름>
>로 푼 것을 참고하여 다시 풀어보았다. - 수학 공식을 풀듯이 조합을 계산해보면
- 종류가 1개, 개수는 a개 → 입을 수 있는 경우의 수는 a개
- 종류가 2개, 개수는 a, b개 → 입을 수 있는 경우의 수는 a, b, ab로 3개
- 종류가 3개, 개수는 a, b, c개 → 입을 수 있는 경우의 수는 a, b, c, ab, bc, ac, abc로 7개
- 즉,
각 종류의 개수 + 1
를 다 곱해준 뒤-1
해주면 된다는 것을 알았다.
//시간: 0.12ms
//메모리: 87.1MB
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String, List<String>> map = new HashMap<>();
for (String[] cloth : clothes) {
String name = cloth[0];
String category = cloth[1];
if (map.containsKey(category)) {
map.get(category).add(cloth[0]);
} else {
List<String> list = new ArrayList<>();
list.add(cloth[0]);
map.put(cloth[1], list);
}
}
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
int size = map.get(iter.next()).size();
answer *= (size + 1);
}
return answer - 1;
}
}
두 번째 풀이
- 첫 번째 풀이를 풀다보니, 옷의 종류마다 몇 개의 옷을 가지고 있는지가 중요하지 어떤 옷이 있는지를 알 필요가 없다는 걸 알았다.
- 그래서
HashMap
의Value
로 종류별 개수를 넣을 수 있도록 바꾸었다. map.put(category, map.getOrDefault(category, 0) + 1);
map.getOrDefault(cateory, 0)
는category
가 존재하면Value
를, 존재하지 않으면0
을 리턴한다.- 그리고 위의 값을 다시 동일한
category
를key
로 가지는value
로 넣을 때,1
을 더해준다. (종류별 개수가 하나 증가했기 때문)
//시간: 0.15ms
//메모리: 82.5MB
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String, Integer> map = new HashMap<>();
for (String[] cloth : clothes) {
String category = cloth[1];
map.put(category, map.getOrDefault(category, 0) + 1);
}
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
answer *= (map.get(iter.next()) + 1);
}
return answer - 1;
}
}