[프로그래머스] 위장

문제 설명

  • 2차원 배열이 (‘옷의 이름’, ‘옷의 종류’)로 리스트로 들어온다.

풀이 과정

  • 해쉬맵을 이용해 옷의 종류별로 옷이 몇 개가 존재하는지 저장했다.
  • 이후, 조건에 맞게 스파이 옷을 조합시켜야 하는데, 아예 안입는 경우를 제외한 1벌씩 입는 경우, 2벌씩 입는 경우 … 옷의 종류만큼 입는 경우를 다 탐색할 경우 문제가 생긴다.
  • 옷은 최대 30벌이 입력으로 들어올 수 있는데, 모든 옷이 다른 종류에 속할 경우 조합탐색에 있어 30C1 + 30C2 + 30C3 ... 의 가지수가 생기기 때문이다.
  • 간단하게 계산하는 방법을 떠올려야 했는데, 쉽지 않았다.
  • 하나의 종류에 옷이 N개가 있을 경우, 이 종류에서 옷을 꺼내입는 경우는 N+1이 된다.
  • ex) headgear 종류의 옷이 N개가 있을 때, 안입는 경우, 1번 옷 입는 경우, 2번 옷 입는 경우 … N번 옷을 입는 경우.
  • 모든 종류의 옷을 선택할 수 있는 가지수를 곱해주면, 빠르게 해결할 수 있는 식이 완성된다.
  • 이를 토대로 해쉬맵의 사이즈만큼 돌면서 value+1을 answer에 곱해나가주었다.
  • 마지막엔 모든 옷을 안입는 경우가 생기기 때문에 -1을 해주었다.
import java.util.*;

public class LEV2_위장 {
    public int solution(String[][] clothes) {
        int answer = 1;
        Map<String, Integer> map = new HashMap<>();
        for (String[] clothe : clothes) {
            String kind = clothe[1];
            map.put(kind, map.getOrDefault(kind, 0) + 1);
        }
        for (int count : map.values()) {
            answer *= (count + 1);
        }
        return answer - 1;
    }
}

댓글남기기