[고득점 kit] 의상

화낼거양's avatar
Nov 21, 2024
[고득점 kit] 의상
 
 

문제

 
notion image
 
기본적으로 주어진 코드 :
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을 뺍니다.
 

전체 코드의 작동 과정

  1. 배열 정렬: 의상 배열을 종류별로 정렬합니다.
  1. 의상 종류별 개수 계산: 각 의상 종류의 개수를 계산하여 리스트에 저장합니다.
  1. 조합의 총 경우의 수 계산: 모든 조합의 수를 계산하고, 최종 결과를 반환합니다.
Share article

moohyun