나의 풀이
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
Map<String, Integer> counter = new HashMap<>();
for (String[] c:clothes) {
String type = c[1];
//맨 처음에 counter Map에서 get(type)하는 경우에는 아무것도 없기 때문에 null이므로 value값을 0으로 초기화 해준다.
Integer count = counter.get(type);
if(count ==null){
count=0;
}
//put메서드가 실행될때마다 해당 key 즉 type에 대한 valuer값을 +1씩 늘려준다.
counter.put(type, count+1);
}
// Set<Map.Entry<String, Integer>> entries = counter.entrySet();
// System.out.println("entries = " + entries);
List<Integer> values = new ArrayList<>(counter.values());
values.replaceAll(value -> value + 1);
Integer total = values.stream().reduce(1, (a, b) -> a * b);
return total-1;
}
}
문제풀이 설명
머리 3, 상의 2, 하의 1개 조합이면 23개가 나와야 한다.
머리: 머리1, 머리2, 머리3
상의: 상의1, 상의2
하의: 하의1
하나만 입었을 때: 6개
머리1
머리2
머리3
상의1
상의2
하의1
2개 조합: 11개
머리1, 상의1
머리1, 상의2
머리2, 상의1
머리2, 상의2
머리3, 상의1
머리3, 상의2
머리1, 하의1
머리2, 하의1
머리3, 하의1
상의1, 하의1
상의2, 하의1
3개 조합: 6개
머리1, 상의1, 하의1
머리2, 상의1, 하의1
머리3, 상의1, 하의1
머리1, 상의2, 하의1
머리2, 상의2, 하의1
머리3, 상의2, 하의1
(3[머리]+1) * (2[상의]+1) * (1[하의]+1) - 1[안입을때] = 23개의 조합 맞다.
a,b,c 가 부위 별이라고 할때 일반화 하면 다음과 같다.
(a + 1)(b + 1)(c + 1) - 1 = (a + b + c) + (ab + bc + ca) + abc
(a + b + c) : 부위별 1개씩 입는 경우
(ab + bc + ca) : 부위별 2개씩 조합해서 입는 경우
abc : 부위별 3개씩 조합해서 입는 경우
요소의 개수 파악: put 할때마다 value에 추가적으로 +1함으로써 요소에 대한 갯수를 파악하였다.
요소 전부 곱하기 : 스트림의 reduce 연산 이용 yourlist.stream().reduce(1, (a,b) -> a*b)
요소 1씩 전부 더하기 : values.replace(value->value+1)
'프로그래머스(자바) > LV.2(자바)' 카테고리의 다른 글
프린터★→ 순서쌍을 사용X, 기능개발과 유사★★+while(true) (0) | 2022.12.28 |
---|---|
기능개발→ 나누기★ + 미친 for문★ +cnt★ (0) | 2022.12.27 |
괄호 회전하기★★ →List의 rotate()를 이용, String → 리스트 (1) | 2022.12.27 |
1차 캐시→ 익명 클래스★★, this참조변수, super() 생성자 (0) | 2022.12.26 |
N개의 최소 공배수→ 연쇄 법칙 (겹치지X) + stack이용 (0) | 2022.12.24 |