[Java Algorithm] 프로그래머스 Lv.2 _ 의상

2025. 7. 28. 19:06·Algorithm Study

[문제]

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

종류   이름
얼굴   동그란 안경, 검정 선글라스
상의   파란색 티셔츠
하의   청바지
겉옷   긴 코트

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

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

 

[Algorithm]

의상 종류별로 몇 개의 의상이 있는지 먼저 카운트한다.

그리고 의상별로 조합이 몇 개가 나오는지 계산한다.

 

이때, 주의해야 할 점은 의상 종류별로 아무것도 안 입는 경우를 고려해야 한다는 점!

그리고 마지막에 아.무.것.도 안 입은 경우 1가지를 빼준다.

 

1. HashMap 생성

2. 각 의상 종류별로 의상 개수 카운트

3. 각 의상 종류별로 개수 + 1을 곱해줌 (의상 조합 개수 카운트)

4. 아무것도 입지 않은 경우 빼주기 -1

 

[Code]

import java.util.HashMap;

class Solution {
    public int solution(String[][] clothes) {
        HashMap<String, Integer> clothesMap = new HashMap<>();
        
        for (String[] cloth : clothes) {
            String type = cloth[1];
            clothesMap.put(type, clothesMap.getOrDefault(type, 0) + 1);
        }
        
        int answer = 1;
        for (int count : clothesMap.values()) {
            answer *= (count + 1);
        }
        
        return answer - 1;
    }
}

 

 

[+ 다른 사람 풀이]

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;
    }
}

 

댓글에 감탄이라며 난리가 난 풀이

이 풀이는 stream을 활용한 풀이다 (난 해시 카테고리라 해시로만 생각했음..)

 

1. Arrays.stream(clothes)

→ stream을 이용해서 2차원 배열을 독립적인 스트림 요소로 변환(Stream<String[]>)

 

2. .collect(groupingBy(p -> p[1], mapping(p -> p[0], counting())))

→ 각 배열의 두번째 요소인 의상 종류로 그룹화하고 각 배열의 첫 번째 요소인 의상 이름을 매핑해줌

    그리고 counting()을 활용해서 각 그룹의 개수를 세어줌

    결과는 Map<String, Long> 형식으로 반환

 

3. .values()

→ Map의 values만 추출

 

4. .stream()

→ Collection을 다시 독립적인 스트림 요소로 변환 (Stream<Long>)

 

5. .collect(reducing(1L, (x,y) -> x * (y+1)))

→ 각 의상 종류별 개수 + 1 을 다 곱해서 경우의 수 찾기

 

6. .intValue() - 1;

→ 아무것도 안입은 경우 빼기

 

알고리즘의 흐름은 같지만 사용한 함수가 다른 풀이법

stream은 정말 .. 좋은데 은근히 어렵다 ㅠ-ㅠ

 

[+ Plus]

더보기
더보기

💡Java Stream의 Collector - reducing() 메소드

.collect(reducing(identity, accumulator))

- identity : 초기값(누적 연산의 시작점)

- accumulator: 누적 함수

 

저작자표시 변경금지 (새창열림)

'Algorithm Study' 카테고리의 다른 글

[Java Algorithm] 프로그래머스 Lv.1 _ K번째수  (2) 2025.07.29
[Java Algorithm] 프로그래머스 Lv.3 _ 베스트앨범  (1) 2025.07.28
[Java Algorithm] 프로그래머스 Lv.2 _ 전화번호 목록  (1) 2025.07.28
[Java Algorithm] 프로그래머스 Lv.0 _ 주사위 게임 3  (2) 2025.03.13
[Java Algorithm] 프로그래머스 Lv.0 _ 간단한 논리 연산  (1) 2025.03.05
'Algorithm Study' 카테고리의 다른 글
  • [Java Algorithm] 프로그래머스 Lv.1 _ K번째수
  • [Java Algorithm] 프로그래머스 Lv.3 _ 베스트앨범
  • [Java Algorithm] 프로그래머스 Lv.2 _ 전화번호 목록
  • [Java Algorithm] 프로그래머스 Lv.0 _ 주사위 게임 3
microsaurs
microsaurs
개발 스터디로그입니다. 공부한 내용을 정리해서 올립니다 ㅇ-ㅇ
  • microsaurs
    microsaurs.devlog
    microsaurs
  • 전체
    오늘
    어제
    • 분류 전체보기 (157)
      • Side Project (4)
      • Algorithm Study (53)
      • JAVA (8)
      • Swift (11)
      • Python (21)
      • CS (5)
      • React (3)
      • 리얼클래스 studylog (27)
      • 정보처리기사[실기] (23)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    Algorithm
    정보처리기사프로그래밍언어
    ios프로그래밍
    알고리즘
    javaStudy
    Java
    ios프로그래밍을위한스위프트기초
    자바알고리즘
    study
    타일러영어
    javaalgorithm
    SWIFT
    ios개발
    영어회화
    나도코딩
    파이썬문법
    정처기실기
    파이썬기초
    정보처리기사
    영어독학
    더오피스
    스위프트기초
    정보처리기사실기
    파이썬
    The Office
    리얼학습일기
    리얼클래스
    프로그래머스
    프로그래밍언어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
microsaurs
[Java Algorithm] 프로그래머스 Lv.2 _ 의상
상단으로

티스토리툴바