본문 바로가기
PS/프로그래머스

[프로그래머스 *Java] - 위장

by Jman 2022. 7. 20.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

조건

제한시간 45분 이내

 

처음에 문제를 어렵게 생각했다.
주어진 데이터에 맞게 위장할 수 있는 의상을 중복되지 않게 조합을 해서 해당 조합이 몇 개 인지를 찾는 문제다.

그냥 갯수만 풀면 되는 문제였는데
문제를 정말 꼬아서 생각해서 dfs를 돌려 조합을 맞춰야하는 지 알았다.
생각해보니 처음 생각한 방법은 복잡해져서 문제에서 요구하는 바가 아닌 거 같고, 조합할 수 있는 의상 갯수를 묻는 문제니 갯수만 체크를 해주어 풀수 있다고 생각을 했다.

그래서 다시 생각을 해보면
이 문제는 수의 공식을 알면 쉽게 풀수 있었다.
얼굴 2개 (동그란 안경, 선글라스)
상의 1개 (파란색 티셔츠)
하의 1개 (청바지)
겉옷 1개 (긴 코트)
라고 하면?
(얼굴+1) * (상의+1) * (하의+1) * (겉옷+1) - (아무것도 입지 않는 수) = ?
+1를 해주는 이유는,
예시로 상의와 하의 두 가지 의상 종류가 있을 때? 상의만 택하고 하의를 택하지 않을 수도, 하의를 택하고 상의를 택하지 않을 수도 있기 때문에 각 종류별로 +1를 해주는 것이다.

이렇게 조합은 (2+1) * (1+1) * (1+1) * (1+1) - 1 = 35개

HashMap 이라는 자료구조를 사용해서,
getOrDefault 를 이용해서, 중복된 의상종류의 갯수를 HashMap에 value 값으로 저장하는 방식을 고안했다.

사실 이게 끝이다.

 

import java.util.*;

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