반응형
수학적인 규칙을 알아내서 알고리즘을 구하는 방식이다.
위 문제에 따르면 각각의 종류에 따라서 최소 1가지의 종류를 이용하여 옷을 입어야 한다.
종류 | A | B | C |
옷의 가지수(개) | a | b | c |
위와 같다면, 총 나올수 있는 옷의 조합은
(각 옷을 안입는경우수 포함)곱의법칙 - (아무것도 안입는 경우) = (a+1)*(b+1)*(c+1) -1
이 계산식을 이용하여 값을 구하면 된다.
필자의 코드는 아래와 같다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 0;
HashMap<String, Integer> hm = new HashMap<>();
for (int i = 0; i < clothes.length; i++) {
hm.put(clothes[i][1] , hm.getOrDefault(clothes[i][1],0)+1 );
}
int result =1;
for (String key : hm.keySet()) {
result = result * (hm.get(key)+1);
}
answer = result -1;
return answer;
}
}
String[][] clothes에는 1차원에는 옷의 종류, 2차원에는 옷의 이름이 넣어져있으므로,
HashMap을 이용해서 각 옷의 종류(clothes[i][1])에 따른 옷의 개수(hm.getOrDefault(clothes[i][1],0) +1) 를 구한다.
이렇게 각 옷의 종류에 따른 옷의 개수를 해쉬맵에 각각 Key, Value 값으로 넣었다.
hm.get()메소드를 이용해 Key값을 넣으면 Value값(옷의개수)를 얻을 수 있다.
얻은 Value 값을 위 연산식을 이용해 answer 값을 구한다.
다른 코드 참고(스트림)
import java.util.*;
import static java.util.stream.Collectors.*;
class Solution {
public int solution(String[][] clothes) {
return Arrays.stream(clothes)
.collect(groupingBy(p -> p[1], mapping(p -> p[0], counting())))
.values()
.stream()
.collect(reducing(1L, (x, y) -> x * (y + 1))).intValue() - 1;
}
}
반응형
'코딩테스트 > Java' 카테고리의 다른 글
[JAVA] 스택/큐 "기능개발" (1) | 2020.09.05 |
---|---|
[JAVA] 스택/큐 "주식가격" (0) | 2020.09.05 |
[JAVA] 해시 "전화번호 목록" (0) | 2020.08.31 |
[JAVA] 해시 "베스트앨범" (0) | 2020.08.31 |
[JAVA] 해시 "완주하지 못한 선수" (0) | 2020.08.24 |