해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다.
종류별 갯수를 구하고 조합이 몇개인지 묻는 문제입니다. 의상의 종류별 의상들의 이름이 나오고 종류별 조합을 구하여 결과값으로 반환합니다.
종류별 갯수를 구하기 위해선 종류가 중복해서 나오는걸 감안하여 Map
자료형을 이용하면 쉽게 종류별 갯수를 구할 수 있을 것입니다.
또 주의해야할 것은 2가지가 있는데 첫번째로 해당 의상 종류를 착용 안하는 경우와 아무것도 입지 않은 경우입니다.
해당 의상 종류를 입지 않았다는것은 모자면 모자 상의면 상의 하의면 하의 등 종류 내에서 아무것도 입지 않은 경우입니다. 그래서 종류별 개수를 +1(아무것도 선택x)를 합니다.
하지만 전부를 아무것도 입지 않은 것은 위장을 하지 않은 것이기 때문에 전체 조합에서 -1을 최종적으로 수행해야 합니다.
Map<String,Integer> map = new HashMap<>();
// 위장용품 종류별 개수를 구한다.
for(String[] c : clothes){
String type = c[1];
map.put(type,map.getOrDefault(type,1) + 1);
}
아무것도 입지 않은 경우도 카운트 시켜줘야하므로 1부터 시작했습니다. 이미 존재할 시 갯수를 1개씩 더합니다.
int answer = 1;
var iter = map.values().iterator();
while(iter.hasNext()){
answer *= iter.next();
}
종류별 갯수를 곱합니다. answer에 종류별 갯수를 곱해주면 전체를 곱한것과 동일합니다.
// -1 해서 리턴한다.
return answer - 1;
아무 의상도 입지 않은 경우는 위장을 하지 않은 경우이므로 제외시킵니다.
-1
을 하여 갯수에서 뺍니다.
강의의 풀이입니다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
//[["yellowhat", "headgear"],
//["bluesunglasses", "eyewear"],
//["green_turban", "headgear"]]
// headgear : 2 -> 3
// eyewear : 1 -> 2
// 3 * 2 == 6 - 1 => 5
Map<String,Integer> map = new HashMap<>();
// 위장용품 종류별 개수를 구한다.
for(String[] c : clothes){
String type = c[1];
map.put(type,map.getOrDefault(type,1) + 1);
}
// 각 갯수를 모두 곱한다.
int answer = 1;
var iter = map.values().iterator();
while(iter.hasNext()){
answer *= iter.next();
}
// -1 해서 리턴한다.
return answer - 1;
}
}
저의 풀이입니다.