알고리즘
[프로그래머스] 위장
DevBee
2021. 3. 31. 23:48
programmers.co.kr/learn/courses/30/lessons/42578
코딩테스트 연습 - 위장
programmers.co.kr
문제는 위와 같으며, 먼저 주어진 이차원 배열을 {"의상의 종류": "해당 종류의 의상 수"} 형태의 Map으로 변환합니다. 이후 각 의상의 수 + 1을 최종 답에 곱한 뒤, 마지막으로 -1을 하여 답을 얻을 수 있습니다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
// {종류: 갯수} 형태 맵 생성
Map<String, Integer> clothesMap = new HashMap<>();
for (String[] clothe : clothes) {
// 종류 여부를 판단하여 없는 경우 0 + 1, 있는 경우 기존 갯수 + 1 값을 저장
clothesMap.put(clothe[1], clothesMap.getOrDefault(clothe[1], 0) + 1);
}
// 경우의 수 확인 answer *= (옷의 개수 + 입지 않을 경우)
for (int cnt : clothesMap.values()) {
answer *= (cnt + 1);
}
// 모든 옷을 입지 않는 경우는 없기 때문에 -1
return answer - 1;
}
}
경우의 수를 확인할 때 각 종류별로 옷을 하나씩 입는 경우(옷의 개수) + 해당 종류의 옷을 입지 않는 경우(1)를 구하였고, 옷의 종류는 독립적이기 때문에 모든 종류에 대해 경우의 수를 곱해줍니다.
최종적으로 나온 수에서 -1을 하는 이유는 아무 종류의 옷도 입지 않는 경우는 없기 때문에 이 경우를 제외시켜주는 것입니다.
Map에 해당 키가 포함되어 있는지 아닌지를 if 문으로 판단하지 않고 getOrDefault 메소드를 사용하여 처리함으로써 Null을 방지할 수 있었습니다. getOrDefault 메소드는 첫번째 파라미터로 주어진 값을 key로 하여 Map에서 값을 구하고 그 key가 존재하지 않는다면 두번째 파라미터 값을 기본 값으로 반환하는 메소드입니다.