[programmers] Java Lv.2 - 의상

2025. 1. 22. 11:10·Algorithm Solving/Java

https://school.programmers.co.kr/learn/courses/30/lessons/42578

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 설명
코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.
예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.

  • 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
  • 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
  • 코니는 하루에 최소 한 개의 의상은 입습니다.

코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 코니가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.

 

입출력 예 설명
예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

 


 

풀이

접근 방식

 

Stream `reduce` 사용하기

서로 다른 옷의 조합의 수를 계산할 때, for문을 이용할 수 있지만 stream으로 적용하는 방법을 공부해보고 싶어서 알아봤다.

        // for문 이용하는 방법
        int answer = 1;
        for (int quantity : categoryQuantity.values()) {
            answer *= quantity+1;
        }

 

`reduce`는 Stream API의 연산 중 하나로, 스트림의 요소를 하나로 축약(누적)하기 위해 사용된다.
예를 들어, 합계, 곱셈, 최소값, 최대값 등을 구할 때 활용할 수 있다.

이 문제의 경우 곱셈을 구하는 것이므로 아래와 같이 작성해서 사용해줬다.

        // 서로 다른 옷의 조합의 수 계산
        // stream reduce 이용하는 방법
        int answer = categoryQuantity.values().stream()
                .reduce(1, (tempAnswer, quantity) -> tempAnswer * (quantity + 1));

하지만 int같은 원시 자료형(Primitive Type)의 경우 stream을 사용하는 것보다 for문의 성능이 좋기 때문에,

문제를 풀고 제출할 때는 stream.reduce를 사용하는 것 보다 for문을 사용하는 것이 좋아보인다.

 

풀이 코드

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        String[][] clothes = {{"yellow_hat", "headgear"},
                {"blue_sunglasses", "eyewear"},
                {"green_turban", "headgear"}};

        HashMap<String, Integer> categoryQuantity = new HashMap<>();
        for (String[] clothe : clothes) {
            String category = clothe[1];
            int quantity = categoryQuantity.getOrDefault(category, 0) + 1;
            categoryQuantity.put(category, quantity);
        }

        // 서로 다른 옷의 조합의 수 계산
        // stream reduce 이용하는 방법
        int answer = categoryQuantity.values().stream()
                .reduce(1, (tempAnswer, quantity) -> tempAnswer * (quantity + 1));
        /*
        // for문 이용하는 방법
        int answer = 1;
        for (int quantity : categoryQuantity.values()) {
            answer *= quantity+1;
        }
        */

        // 아무것도 착용하지 않은 경우를 제외
        answer --;

        System.out.println(answer);
    }
}

 


 

제출

import java.util.HashMap;
class Solution {
    public int solution(String[][] clothes) {
        HashMap<String, Integer> categoryQuantity = new HashMap<>();
        for (String[] clothe : clothes) {
            String category = clothe[1];
            int quantity = categoryQuantity.getOrDefault(category, 0) + 1;
            categoryQuantity.put(category, quantity);
        }
        // 서로 다른 옷의 조합의 수 계산
        int answer = categoryQuantity.values().stream()
                .reduce(1, (tempAnswer, quantity) -> tempAnswer * (quantity + 1));
        // 아무것도 착용하지 않은 경우를 제외
        answer --;
        
        return answer;
    }
}
저작자표시 비영리 변경금지 (새창열림)

'Algorithm Solving > Java' 카테고리의 다른 글

[programmers] Java Lv.2 - 프로세스  (1) 2025.02.07
[programmers] Java Lv.2 - 기능개발  (0) 2025.01.27
[programmers] Java Lv.2 - 할인 행사  (2) 2025.01.21
[programmers] Java Lv.2 - 행렬의 곱셈  (1) 2025.01.16
[programmers] Java Lv.2 - n^2 배열 자르기  (0) 2025.01.15
'Algorithm Solving/Java' 카테고리의 다른 글
  • [programmers] Java Lv.2 - 프로세스
  • [programmers] Java Lv.2 - 기능개발
  • [programmers] Java Lv.2 - 할인 행사
  • [programmers] Java Lv.2 - 행렬의 곱셈
기만나🐸
기만나🐸
공부한 내용을 기록합시다 🔥🔥🔥
  • 기만나🐸
    기만나의 공부 기록 🤓
    기만나🐸
  • 전체
    오늘
    어제
    • ALL (147)
      • TIL (Today I Learned) (56)
      • Dev Projects (15)
      • Algorithm Solving (67)
        • Java (52)
        • SQL (15)
      • Certifications (8)
        • 정보처리기사 실기 (8)
  • 인기 글

  • 태그

    dp
    websocket
    다이나믹프로그래밍
    프로그래머스
    Firebase
    완전탐색
    백준
    jwt
    join
    HTML
    jQuery
    백트래킹
    programmers
    자료구조
    GROUP BY
    java
    DFS
    jpa
    bootstrap
    Subquery
    BOJ
    그리디
    Google Fonts
    mysql
    BFS
    시뮬레이션
    CSS
    sql
    greedy
    javascript
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기만나🐸
[programmers] Java Lv.2 - 의상
상단으로

티스토리툴바