today_is

[ 알고리즘 ] 의상 본문

카테고리 없음

[ 알고리즘 ] 의상

ye_rang 2024. 6. 12. 18:32

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

코드

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;

        
        HashMap<String, Integer> map = new HashMap<>();
        
        for(int i=0; i< clothes.length; i++) {
            map.put(clothes[i][1], map.getOrDefault(clothes[i][1], 0) + 1);
        }
        
        for(String key : map.keySet()) {
            answer *= (map.get(key) + 1);
        }
        
        answer -= 1;
        
        return answer;
    }
}

 

 

 

 한줄씩 해석 

answer값을 1로 초기화해둔다    :  경우의 수를 구하기 위해서 곱하기를 계속해야하는데, 0이면 곱하기를 해도 의미 없음

 

key(String) , value(Integer)로 HashMap객체를 만든다

 

반복문을 이용 {

     map에 clothes[i][1]번째 값에 대한 빈도수를 측정한다

    : 즉, key는 의상의 종류 / value는 의상의 종류에 대한 빈도수  

       의상 종류별로 몇개가 있는지 먼저 파악한다.

}

 

반복문을 이용하여, map의 key모음의 각각을 key 라고 한다 {

   (의상 종류에 대한 빈도수 + 1) 을 answer에 계속 곱한다

   : 모든 경우의 수 구하는 공식 !!

}

 

마지막으로 answer에 -1를 하여서 아무것도 입지 않는 경우를 뺀다!

: 문제 조건에 있었음. 무조건 1개 이상의 옷을 조합해야함 

 

 

 

 

 어려웠던 부분 

이 문제는 지켜야할 조건이 많아서 어려웠다 

중복없는 조합을 해야하면서 / 아무것도 입지 않는 경우는 빼야하고 / 이차원배열로 값이 주어진다

 

 

의상의 종류 별로 개수를 먼저 알아야 조합을 해볼 수 있다고 생각하여

map을 이용한 빈도수를 측정했다.

 

 

로직을 제대로 구성했다고 생각했는데

answer를 리턴해도 계속 0이어서 의문이었다.

알고보니 answer = 0를 고치지 않았기때문이었네 하하

 

프로그래머스는 주어진 대로 문제를 풀면 안되는 경우가 많은 것 같아서 더 어렵다