프로그래머스 위장 문제 풀이

김하영·2023년 3월 16일
0

문제링크: https://school.programmers.co.kr/learn/courses/30/lessons/42578

사용한 자료구조: 해쉬맵

카테고리 별로 옷의 개수를 저장하기 위해 key, value쌍으로 데이터를 관리하는 HashMap을 선택했다.


찾아낸 규칙

카테고리 별로 옷을 저장하기 위해 key값은 카테고리로 정하고, value값은 겹치는 옷은 없다고 문제에서 주어졌으므로 개수만 세도록 한다.

그렇게 맵에 각 카테고리 별로 선택할 수 있는 옷의 개수를 저장한다.

그리고 위장할 수 있는 방법을 세기 위해 각 카테고리 별로 입을 수 있는 옷의 개수 + 1(안입는걸 선택한 경우)을 한 값을 모두 곱해주고 -1(적어도 하나를 입어야 하는데 모두 안입는걸 선택한 경우)을 해준다.


코드 설명

<String, Integer>인 맵을 만든다. key는 카테고리, value는 옷의 개수이다. 이때 겹치는 옷은 없다고 했기 때문에 개수만 세어줘도 되므로 value를 Integer로 받았다.

그리고 주어진 clothes배열을 순회하면서 map에 데이터를 채워준다. 만약 새로운 카테고리가 들어오면 1을 추가해주고 원래 있던 카테고리가 들어오면 이전에 있던 옷의 개수에 +1을 해준다.

그리고 위장 조합의 개수를 정하기 위해 result변수를 하나 만든다.
result에 (카테고리별 옷의 개수+1)을 곱해준다. 여기서 +1은 안입는 경우를 선택하는 경우이다. 즉 (한 카테고리에서 옷을 하나 선택하는 경우) + (안입는 것을 선택하는 경우)인 것이다.
이렇게 모든 카테고리를 순회하며 result를 계산해준다.

문제에서 적어도 하나의 아이템은 착용한다고 했으므로, 모든 카테고리에서 안입는 것을 선택한 경우 한가지를 빼주고 정답을 반환한다.

package HashMapPractice;

import java.util.HashMap;

public class Solution {
    public int solution(String[][] clothes) {
        int answer = 0;
        HashMap<String, Integer> map = new HashMap<>(); // 겹치는 의상이 없으므로 의상 카테고리와 개수만 세면 된다.
        for(String[] set : clothes){
            map.put(set[1],map.getOrDefault(set[1], 0)+1); // 이미 있던 카테고리면 원래 개수에 1을 더하고 없었다면 1을 넣음.
        }
        int result = 1;
        for(Integer i : map.values()){
            result *= (i+1);// 옷을 선택할 수 있는 경우의 수 + 안선택하는 경우1가지
        }
        answer = result -1; // 모두 안입는 것을 선택한 경우를 빼준다.
        return answer;
    }

    public static void main(String[] args) {
        System.out.println(new Solution().solution(new String[][]{{"yellow_hat", "headgear"}, {"blue_sunglasses", "eyewear"}, {"green_turban", "headgear"}}));
        System.out.println(new Solution().solution(new String[][]{{"crow_mask", "face"},{"blue_sunglasses", "face"},{"smoky_makeup", "face"}}));
    }
}

시행착오 및 교훈

오늘 학습한 내용중에

map.put(key, map.getOrDefault(key, defaultValue) +1)

이런 식으로 맵을 구성하는 방법이 있었다! 덕분에 보다 쉽게 맵을 구성할 수 있었다.
이를 통해 역시 경험이 중요하구나를 깨닫게 되었다. 경험을 한번 해봤으니 빠르게 코드를 짜게 된 것이니까!!

조합을 정해주기 위한 조건을 찾는데 시간이 좀 걸렸다. key마다 (value+1)을 모두 곱하고 한가지를 빼주는 규칙을 찾는데 시간이 좀 걸려서 아쉬웠다. 이것도 경험이 되어 다음에 비슷한 문제를 만나면 빨리 풀 수 있게 해줄 거라고 기대해본다!!!

profile
백엔드 개발자로 일하고 싶어요 제발

0개의 댓글