문제

기본적으로 주어진 코드 :
class Solution {
public int solution(String[][] clothes) {
int answer = 0;
return answer;
}
}
정답
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
Arrays.sort(clothes, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return o1[1].compareTo(o2[1]); // 뒤의 값을 기준으로 정렬 } });
}
}
);
List<Integer> list = new ArrayList<>();
int count = 1;
for (int i = 1; i < clothes.length; i++) {
if (clothes[i][1].equals(clothes[i-1][1])) {
count++;
} else {
list.add(count);
count = 1;
}
}
list.add(count);
int result = 1;
//(x+a)(x+b)(x+c) - 1
for (int i = 0; i < list.size(); i++) {
result *= (1+list.get(i));
}
result--;
return result;
}
}
코드 설명
배열 정렬
Arrays.sort(clothes, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return o1[1].compareTo(o2[1]); // 의상의 종류(뒤의 값)을 기준으로 정렬
}
});
- 목적: 의상 종류를 기준으로 정렬합니다.
- Comparator:
o1[1].compareTo(o2[1])
를 사용하여 의상 종류(clothes[i][1]
)를 기준으로 오름차순 정렬합니다.
의상 종류별 개수 계산
List<Integer> list = new ArrayList<>();
int count = 1;
for (int i = 1; i < clothes.length; i++) {
if (clothes[i][1].equals(clothes[i-1][1])) {
count++;
} else {
list.add(count);
count = 1;
}
}
list.add(count);
- 목적: 동일한 의상 종류의 개수를 계산하여 리스트에 저장합니다.
- 로직:
- 반복문을 통해 의상 배열을 순회하면서 이전 의상과 동일한 종류인지 확인합니다.
- 동일한 종류라면
count
를 증가시킵니다. - 다른 종류로 변경되면, 현재까지의
count
를 리스트에 추가하고count
를 초기화합니다. - 마지막으로 남은
count
를 리스트에 추가합니다.
조합의 총 경우의 수 계산
int result = 1;
//(1+a)(1+b)(1+c) - 1
for (int i = 0; i < list.size(); i++) {
result *= (1 + list.get(i));
}
result--;
- 목적: 의상 종류별 조합의 총 경우의 수를 계산합니다.
- 로직:
- 각 의상 종류의 개수에 1을 더한 값을 모두 곱합니다. 이는 각 종류에서 선택하지 않는 경우를 포함하기 위함입니다.
- 최종적으로 모든 조합에서 아무 것도 선택하지 않는 경우를 제외하기 위해 1을 뺍니다.
전체 코드의 작동 과정
- 배열 정렬: 의상 배열을 종류별로 정렬합니다.
- 의상 종류별 개수 계산: 각 의상 종류의 개수를 계산하여 리스트에 저장합니다.
- 조합의 총 경우의 수 계산: 모든 조합의 수를 계산하고, 최종 결과를 반환합니다.
Share article