today_is
[ 알고리즘 ] 의상 본문
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를 고치지 않았기때문이었네 하하
프로그래머스는 주어진 대로 문제를 풀면 안되는 경우가 많은 것 같아서 더 어렵다