[프로그래머스, Java] 의상

2025. 8. 19. 14:53·CodingTest/Programmers

⭐풀이 아이디어

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
'CodingTest/Programmers' 카테고리의 다른 글
  • [프로그래머스, Java] 게임 맵 최단거리
  • [프로그래머스, Java] 네트워크
  • [프로그래머스, Java] 달리기 경주
  • [프로그래머스, Java] 유연근무제
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • Backend (17)
        • SpringBoot (0)
        • Java (17)
      • Cs (20)
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (84)
        • Programmers (84)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    programmers
    BFS
    switch
    BufferedReader
    java
    effectivejava
    BufferedWriter
    CS
    dfs
    codingtest
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[프로그래머스, Java] 의상
상단으로

티스토리툴바