송민준의 개발노트

프로그래머스-level2-위장 본문

알고리즘/프로그래머스

프로그래머스-level2-위장

송민준 2019. 11. 30. 13:39

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

 

코딩테스트 연습 - 위장 | 프로그래머스

 

programmers.co.kr

해시를 이용해 접근하는 방식이다.

종류는 Key, 이름은 value로 하여 종류 갯수만큼 value를 더하였다.

즉, HashMap<String, Integer> 형태인 것이다.

코드를 통해 알아보자.

먼저 for문으로 1차원 배열 clothe에 2차원 배열 clothes를 담는다.

그리고 해쉬맵에 값을 담는다. 키값에는 종류가 들어가고(인덱스 1)  value에는 getOrDefault를 사용하여 키값이 없으면 0을 주고 키값이 있으면 그 키값의 값을 가져온다. 그리고 +1을 해준다. ( 카운팅해주는 개념이라 보면됨)

 

다음으로 경우의 수를 따져 값을 반환해야 하는데...

예를 들어 종류가 3가지이고 각각 (2, 1, 3) 이라는 값들을 가지고 있다.

그럼 경우의 수는 다음과 같다. (보기 좋게 괄호로 구분하였음.)

(2+1+3) + ((2*1) + (1*3) + (2*3)) + (2*1*3)

이 경우 확률과 통계에서 사용하는 경우의 수 공식이있다.

위에서 내가 말한 3가지 A, B, C (2, 1, 3)이 있으면 다음과 같다.

(A+1) * (B+1) * (C+1) -1 

여기서 -1을 해주는 아무것도 선택 안한 경우의 수를 빼준 것이다.

이를 코드로 표현 한게

	int answer = 1;

        for (int value : map.values()) {
            answer *= (value + 1);
        }
        answer -=1;

answer을 초기화 해야 하기 때문이 1이 와야한다.(곱해야 하기 때문에 0이 아닌 1)

 

그리고 map.values()로 값들을 가져오고 answer에 곱해준다.

 

마지막 -1까지 해주면 끝...!

 

공식적용이 안되면 코드가 꽤 길어질듯하다...