✔ 의상
문제 분석하기
의상의 종류에 따라 해시 맵에 (의상의 종류, 의상의 종류에 따른 갯수)를 저장한 후
의상의 종류에 따른 경우의 수를 반환함
예) (얼굴 : 2), (상의 : 1), (하의 : 1), (겉옷 : 1)
(2+1)*(1+1)*(1+1)*(1+1) - 1 = 23개의 경우의 수
+1을 해준 것은 이 의상 종류에서 하나도 선택하지 않을 경우를 추가한 것
마지막에 -1을 해준 것은 아무 것도 입지 않을 경우를 빼준 것
손으로 풀어보기
- HashMap에 (의상의 종류, 1) 저장
- 이미 의상의 종류가 존재한다면 기존 숫자에 +1
- 의상의 종류에 따른 경우의 수를 반환
슈도코드 작성하기
clothes(의상의 이름과 의상의 종류 배열)
answer = 의상 조합하기 함수
answer 반환
의상 조합하기 함수 {
map(의상의 종류와 갯수가 담긴 hashMap)
for(clothes의 길이만큼) {
if(의상의 종류가 존재한다면) {
map에 기존 갯수 + 1
}
else {
map에 의상의 종류와 1 저장
}
}
result(모든 경우의 수 갯수) = 1
for(map의 크기만큼) {
result *= map의 의상의 종류에 따른 갯수 + 1
}
return result - 1
}
코드 구현하기
/**
* 42578) 의상
*/
public class K004_42578 {
// clothes(의상의 이름과 의상의 종류 배열)
public int solution(String[][] clothes) {
// answer = 의상 조합하기 함수
int answer = mixClothes(clothes);
// answer 반환
return answer;
}
// 의상 조합하기 함수
private int mixClothes(String[][] clothes) {
// map(의상의 종류와 갯수가 담긴 hashMap)
Map<String, Integer> map = new HashMap<>();
for (String[] clothe : clothes) {
// 의상의 종류가 존재한다면
if (map.containsKey(clothe[1])) {
// map에 기존 갯수 + 1
map.put(clothe[1], map.get(clothe[1]) + 1);
} else {
// map에 의상의 종류와 1 저장
map.put(clothe[1], 1);
}
}
// result(모든 경우의 수 갯수) = 1
int result = 1;
for (int key : map.values()) {
// result *= map의 의상의 종류에 따른 갯수 + 1
result *= (key + 1);
}
// result - 1(아무 것도 입지 않을 경우) 반환
return result - 1;
}
// 테스트 케이스
public static void main(String[] args) {
K004_42578 solution = new K004_42578();
String[][] clothes = { { "yellow_hat", "headgear" },
{ "blue_sunglasses", "eyewear" },
{ "green_turban", "headgear" } };
int result = solution.solution(clothes);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[42587] 프로세스 (0) | 2023.11.27 |
---|---|
[42579] 베스트앨범 (0) | 2023.11.27 |
[1844] 게임 맵 최단거리 (0) | 2023.11.26 |
[42898] 등굣길 (0) | 2023.11.25 |
[42883] 큰 수 만들기 (0) | 2023.11.25 |