coding_test

[99클럽 4기 코테 스터디 TIL 4일차 보너스문제] 의상 (feat. 해시맵)

jeri 2024. 10. 31. 22:47
반응형

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

 

프로그래머스

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

programmers.co.kr

1) 내가 구현한 코드

import java.util.*;

class Solution {
        
    public int solution(String[][] clothes) {
        int answer = 1;
        
        // "type" : count
        Map<String,Integer> clothMap = new HashMap<>();
        
        for(String[] cloth:clothes){  
            clothMap.put(cloth[1], clothMap.getOrDefault(cloth[1],0)+1);     
            // System.out.println(cloth[0]);//cloth
            // System.out.println(cloth[1]);//type
        }
        // System.out.println(clothMap);
        
        
        //Map.get(Object key) : 키값 반환
        //Map.getOrDefault(Object key, V defaultValue): 특정 키가 없을 때 기본값 반환
        //Map.keySet() : 모든 키를 Set 형태로 반환
        //Map.values() : 모든 값을 Collection 형태로 반환
        //Map.entrySet() : 키-값 쌍으로 이루어진 Map.Entry 객체들의 Set을 반환
        //Map.putIfAbsent(Object key, value) : 특정 키가 없을 때만 키와 값을 추가
        for(Integer value:clothMap.values()){
            answer *= (value+1);
        }
        answer = answer-1;
        return answer;
    }
}

 

2) 오늘의 학습 키워드

  • 조합 계산 및 의상 분류
  • 해시맵을 이용한 데이터 관리
  • 조합 수 계산의 수학적 원리

3) 공부한 내용 정리

이 문제는 코니가 가진 의상들을 조합하여 서로 다른 착용 방법의 수를 계산하는 문제이다.

각 의상은 종류별로 나뉘어 있으며, 각 종류에서 하나의 의상만 착용할 수 있다.

의상의 조합을 계산하기 위해 해시맵을 사용하여 각 종류의 의상 개수를 세고, 이를 통해 조합의 수를 계산한다.

4) 문제 해결 과정

  1. 의상 종류별로 의상 개수 세기:
    • 의상 종류를 키로 하고, 각 의상 개수를 값으로 저장하는 해시맵을 생성한다.
  2. 조합 수 계산:
    • 각 의상 종류별로 (의상 개수 + 1)을 곱하여 조합 수를 계산한다.
    • 여기서 +1은 해당 종류의 의상을 선택하지 않는 경우를 포함하기 위함이다.
  3. 최종 결과 반환:
    • 조합 계산 후 아무 의상도 입지 않는 경우를 제외하기 위해 최종 결과에서 1을 뺀다.
  4. 추가 구현 코드:
import java.util.HashMap;

public class Solution {
    public int solution(String[][] clothes) {
        HashMap<String, Integer> clothingMap = new HashMap<>();

        // 의상 종류별로 개수 세기
        for (String[] cloth : clothes) {
            String type = cloth[1];
            clothingMap.put(type, clothingMap.getOrDefault(type, 0) + 1);
        }

        // 조합 수 계산
        int combinations = 1;
        for (int count : clothingMap.values()) {
            combinations *= (count + 1); // 각 의상 종류별로 (의상 개수 + 1) 곱하기
        }

        // 아무 의상도 입지 않는 경우 제외
        return combinations - 1;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();

        String[][] clothes1 = {
            {"yellow_hat", "headgear"},
            {"blue_sunglasses", "eyewear"},
            {"green_turban", "headgear"}
        };
        System.out.println(sol.solution(clothes1)); // 출력: 5

        String[][] clothes2 = {
            {"crow_mask", "face"},
            {"blue_sunglasses", "face"},
            {"smoky_makeup", "face"}
        };
        System.out.println(sol.solution(clothes2)); // 출력: 3
    }
}

 

5) 오늘의 회고

  • 문제점
    • 의상 조합 수를 효율적으로 계산하기 위한 알고리즘을 찾는 데 어려움이 있었다.
  • 시도한 방법
    • 해시맵을 사용하여 의상 종류별 개수를 세고, 수학적 원리를 적용하여 조합 수를 계산하는 방법으로 문제를 해결하였다.
  • 새롭게 알게 된 점
    • 의상 조합 문제에서 해시맵을 활용해 데이터를 구조적으로 관리하는 방법과,
    • 조합 계산의 수학적 원리를 통해 효율적인 알고리즘을 설계할 수 있다는 것을 확인하였다.
  • 내일 학습 목표
    • 다양한 조합 문제를 풀어보고, 더 복잡한 데이터셋을 다루는 연습을 통해 알고리즘 문제 해결 능력을 키울 것이다.
반응형