티스토리 뷰

반응형

문제설명

 

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

 

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

 

제한사항

 

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

 

 

 

public static int solution(String[][] clothes) {

		String arr[] = new String[clothes.length];
		int k = 0;
		int answer = 1;

		HashMap<String, String> ht = new HashMap<String, String>();
		HashMap<String, Integer> ht2 = new HashMap<String, Integer>();
		for (int a = 0; a < clothes.length; a++) {
			ht.putIfAbsent(clothes[a][1], clothes[a][0]);// 들어있는게 없으면 집어넣음
			if (!ht.get(clothes[a][1]).equals(clothes[a][0])) {// 이것이 같은 카테고리의 첫번쨰가 아니라면
				ht2.put(clothes[a][1], ht2.get(clothes[a][1]) + 1);// ht2에도 같은 카테고리의 밸류를 +1해서 덮어씌우고
			} else {// 같은카테고리의 첫번쨰라면
				ht2.put(clothes[a][1], 1);// ht2에 카테고리 밸류를 1로 해서 집어넣음
				arr[k] = clothes[a][1];// 배열에는 카테고리의 중복되지 않은 이름들이담기고
				k++;// k변수에는 중복하지 않은 카테고리 갯수를 담음
			}
		}

		// arr[]에 각 카테고리의 카운트를 구했는데 구하는방법이 두가지임
		// 예를들면 2, 1, 3 이런식이면 -> 카테고리의 갯수 즉 3에다가 + 2*1 + 2*3 + 1*3 + 2*1*3 이렇게 요소끼리의 곱을 다 더 하는방법과
		// 각 요소에 +1씩해서 3*2*4를 한다음에 아무것도 없을경우를 제외해서 -1 해주는방법

		for (int i = 0; i < k; i++) {// 중복하지 않은 카테고리 갯수만큼 반복
			answer = answer * (ht2.get(arr[i]) + 1);
		}
		return answer - 1;
	}

 

해시맵 두개에 배열 하나 쓸만한 문제였나 싶긴하다.  효율적으로 푼거같지는 않다.

불필요한거 정리하기 귀찮아서 그냥올림

 

1. 옷의 갯수만큼 반복하며, 첫번째 해시맵에  key 로 착용하는 부위, value에 옷이름을 넣어둔다.

//이미 들어가있으면 들어가지 않게함

 

2. 직후에 if문으로 방금넣은값이  첫번째값인지 판단한다.

//여기부터 ht는 사용되지않음

 

3. 방금넣은값이 그 카테고리의 첫번째라면 value에 1을넣고 arr[k]에 key를 넣어주고 k를 1 더해줌

//이 k값은 arr의 진짜 길이가 될것이고 arr에는 헤드기어, 아이웨어등 카테고리가 중복되지 않게 들어감

 

4. 첫번째가 아니라면 value+1해줌

 

5. 위에 포문이끝나면 arr에는 카테고리의 이름들이 담기고, ht2에는 각 카테고리를 키값으로 각각의 수량이 들어가있을것임

 

6. 여기서 답을 구하는방법이 두가지임 위에 주석 참고

 

7. 더 효율적인 방법으로 답구함

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함