⭐풀이 아이디어
1. clothes의 각 행은 [의상의 이름, 의상의 종류]
- 맵에 종류별로 저장하자
2. 예를 들어보자
- 모자1, 바지1, 상의1 로 나올수 있는 경우의 수
모자1
바지1
상의1
모자1 바지1
모자1 상의1
바지1 상의1
모자1 바지1 상의1
총 7가지
왜 7가지가 나왔는가?
1. 각각의 개수의 +1을 해준다
- 모자1을 고른경우, 모자1을 고르지 않은경우 -> 2개
2. +1을 한 모든 값을 곱해준다 2*2*2 = 8
3. 모두 고르지 않은 경우를 고려해 -1 해준다 8-1 = 7
💡풀이 1
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
Map<String, Integer> map = new HashMap<>();
Set<String> types = new HashSet<>();
for(String[] clothe : clothes) {
String type = clothe[1];
types.add(type);
map.put(type, map.getOrDefault(type, 0) + 1);
}
int answer = 1;
for(String type : types) {
answer *= map.get(type) + 1;
}
return answer - 1;
}
}
💡풀이 2
import java.util.*;
class Solution2 {
public int solution(String[][] clothes) {
Map<String, Integer> map = new HashMap<>();
for(String[] clothe : clothes) {
map.put(clothe[1], map.getOrDefault(clothe[1], 0) + 1);
}
return map.values().stream()
.map(e -> e + 1)
.reduce(1, (a,b) -> a*b) - 1;
}
}
📖새로 배운 부분
Java Stream의 reduce
는 스트림의 여러 요소를 하나의 값으로 합치는(줄이는) 연산입니다.
합계, 곱셈, 최댓값 찾기 등 다양한 집계 작업에 사용됩니다.
reduce
는 주로 두 가지 형태로 사용됩니다.
1. 초기값(Identity)을 사용하는 경우
가장 일반적인 형태로, 초기값
과 누적 함수
두 개의 인자를 받습니다.
- 형태:
stream.reduce(초기값, (누적값, 현재요소) -> 다음_누적값)
- 특징:
- 연산의 시작점이 되는
초기값
이 명확히 주어집니다. - 스트림이 비어있어도
초기값
을 그대로 반환하므로, 반환 타입이T
입니다.
- 연산의 시작점이 되는
예시
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 초기값 0에서 시작하여 모든 요소를 더함
int sum = numbers.stream().reduce(0, (a, b) -> a + b); // a: 누적값, b: 현재요소
System.out.println(sum); // 결과: 15
0 + 1 = 1 -> (초기값 0 = a 에 들어감)
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15 (최종 결과)
2. 초기값 없이 사용하는 경우
누적 함수
만 인자로 받습니다.
- 형태:
stream.reduce((누적값, 현재요소) -> 다음_누적값)
- 특징:
- 스트림의 첫 번째 요소가 초기
누적값
이 됩니다. - 스트림이 비어있을 경우, 합칠 요소가 없으므로 결과가 없을 수 있습니다. 따라서 반환 타입이
Optional<T>
입니다.
- 스트림의 첫 번째 요소가 초기
예시:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 스트림이 비어있을 수 있으므로 Optional로 결과를 받음
Optional<Integer> product = numbers.stream().reduce((a, b) -> a * b);
product.ifPresent(System.out::println); // 결과: 120
GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.
프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스, Java] 게임 맵 최단거리 (0) | 2025.08.26 |
---|---|
[프로그래머스, Java] 네트워크 (0) | 2025.08.26 |
[프로그래머스, Java] 달리기 경주 (0) | 2025.07.29 |
[프로그래머스, Java] 유연근무제 (0) | 2025.07.29 |
[프로그래머스, Java] 개인정보 수집 유효기간 (0) | 2025.07.29 |