코딩테스트/Java

[JAVA] 해시 "위장"

SK_MOUSE 2020. 8. 31. 17:45
반응형

https://programmers.co.kr/learn/courses/30/lessons/42578

수학적인 규칙을 알아내서 알고리즘을 구하는 방식이다.

 

위 문제에 따르면 각각의 종류에 따라서 최소 1가지의 종류를 이용하여 옷을 입어야 한다.

종류 A B C
옷의 가지수(개) a b c

위와 같다면, 총 나올수 있는 옷의 조합은

 

(각 옷을 안입는경우수 포함)곱의법칙 - (아무것도 안입는 경우) = (a+1)*(b+1)*(c+1) -1

 

이 계산식을 이용하여 값을 구하면 된다.

 

필자의 코드는 아래와 같다.

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 0;
        HashMap<String, Integer> hm = new HashMap<>();
        for (int i = 0; i < clothes.length; i++) {
            hm.put(clothes[i][1] , hm.getOrDefault(clothes[i][1],0)+1 );
        }
        int result =1;
        for (String key : hm.keySet()) {
            result =  result * (hm.get(key)+1);
        }
        answer = result -1;



        return answer;
    }
}

 

String[][] clothes에는 1차원에는 옷의 종류, 2차원에는 옷의 이름이 넣어져있으므로,

 

HashMap을 이용해서 각 옷의 종류(clothes[i][1])에 따른 옷의 개수(hm.getOrDefault(clothes[i][1],0) +1) 를 구한다.

 

이렇게 각 옷의 종류에 따른 옷의 개수를 해쉬맵에 각각 Key, Value 값으로 넣었다.

 

hm.get()메소드를 이용해 Key값을 넣으면 Value값(옷의개수)를 얻을 수 있다.

 

얻은 Value 값을 위 연산식을 이용해 answer 값을 구한다. 

 

 

 

다른 코드 참고(스트림)

import java.util.*;
import static java.util.stream.Collectors.*;

class Solution {
    public int solution(String[][] clothes) {
        return Arrays.stream(clothes)
                .collect(groupingBy(p -> p[1], mapping(p -> p[0], counting())))
                .values()
                .stream()
                .collect(reducing(1L, (x, y) -> x * (y + 1))).intValue() - 1;
    }
}

 

 

반응형

'코딩테스트 > Java' 카테고리의 다른 글

[JAVA] 스택/큐 "기능개발"  (1) 2020.09.05
[JAVA] 스택/큐 "주식가격"  (0) 2020.09.05
[JAVA] 해시 "전화번호 목록"  (0) 2020.08.31
[JAVA] 해시 "베스트앨범"  (0) 2020.08.31
[JAVA] 해시 "완주하지 못한 선수"  (0) 2020.08.24