[프로그래머스/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;
}
}