본문 바로가기
Etc/문제 풀이

[프로그래머스 42578번] 위장

by Gofo 2021. 1. 26.

문제

번호

위장(프로그래머스 42578번)

내용

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류 이름
얼굴 동그란 안경, 검정 선글라스
상의 파란색 티셔츠
하의 청바지
겉옷 긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

언어

JAVA

 


풀이

처음 시도한 코드

모든 조합을 array에 담고 요소의 개수를 구할까 생각을 해보았다.

그러나 이 방법은 조합 array를 구하는데 걸리는 시간이 불필요하게 소비될 것 같아 포기하였다.

해결방법

입력할 때 2차원 배열이 입려고디며, 각 요소는 [의상 이름, 의상 종류]로 구성되어 있다.

이는 의상의 종류로 의상의 이름을 분류해야 하는데, 의상 종류는 String 타입이며 답을 도출해내는 데에는 의상의 이름은 불필요하다. 그저 개수만 있으면 된다.

따라서 <pre><String, Integer></pre>쌍의 <pre>Map</pre> 이용하여 의상의 종류에 따라 개수를 늘리면 된다.

코드 설명

  1. <pre>Map<String, Integer></pre> 선언하여 의상의 종류별로 개수를 담을 것을 준비한다.
  2. 첫번 <pre>for</pre>문을 통해 입력으로 들어온 <pre>clothes</pre> 종류별로 개수를 추가한다. 해당 종류가 처음 나온 경우 개수를 증가시키는 것이 아닌 1 설정해야 하므로 <pre>if</pre> 통하여 해당 기능을 구현하였다.
  3. 두번 <pre>for</pre>문을 통해 분류된 의상을 가지고 가능한 경우의 수를 구한다. 해당 종류를 입지 않는 경우도 있으므로 <pre>value</pre> <pre>+ 1</pre> 하여 <pre>answer</pre> 곱한다. <pre>Map</pre> <pre>value</pre> 빠르게 접근하기 위해 <pre>iterator</pre> 이용하였다.

 


코드

import java.util.HashMap;
import java.util.Map;

public class hash_level3 {
    static class Solution {
        public int solution(String[][] clothes) {
            int answer = 1;

            Map<String, Integer> count = new HashMap<String, Integer>();

            for(int i = 0 ; i < clothes.length ; i++) {
                if(count.containsKey(clothes[i][1])) {
                    count.put(clothes[i][1], count.get(clothes[i][1]) + 1);
                }
                else {
                    count.put(clothes[i][1], 1);
                }
            }

            for(Integer value : count.values()) {
                answer *= value + 1;
            }

            return answer - 1;
        }
    }

    public static void main(String[] args) {
        // Run test case.
        Solution solution = new Solution();
        String[][] arr = {{"yellow_hat", "headgear"}, {"blue_sunglasses", "eyewear"}, {"green_turban", "headgear"},
                {"crow_mask", "face"}, {"blue_sunglasses", "face"}, {"smoky_makeup", "face"}};

        System.out.println(solution.solution(arr));
        System.out.println("answer : 23");

    }
}

댓글