[프로그래머스] Level2 42578번: 위장 (JAVA)

반응형
728x90
반응형

문제

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

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

 

풀이코드

package com.algorithm._00_._Current;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Date 2022/03/27
 * @URL https://programmers.co.kr/learn/courses/30/lessons/42578
 */
public class P42578_위장 {
    Map<String, List<String>> map = new HashMap<>();

    public static void main(String[] args) {
	    // write your code here
        P42578_위장 main = new P42578_위장();

       // String[][] a = new String[][] { {"yellowhat", "headgear"}, {"bluesunglasses", "eyewear"}, {"green_turban", "headgear"}};
        String[][] b = new String[][] { {"crow_mask", "face"}, {"blue_sunglasses", "face"}, {"smoky_makeup", "face"}};
        //System.out.println(main.solution(a));
        System.out.println(main.solution(b));
    }

    public int solution(String[][] clothes) {
        int answer = 1;

        for (String[] targetArr : clothes) {
            // key 가 이미 포함되어있을 경우
            if (map.containsKey(targetArr[1])) {
                map.get(targetArr[1]).add(targetArr[0]);
            } else {
                // 처음 등록되는 경우 "0"을 함께 등록한다.
                List<String> param = new ArrayList<>();
                param.add("0");
                param.add(targetArr[0]);

                map.put(targetArr[1], param);
            }
        }

        /* 최종 결과는 key(옷의 종류)에 해당하는 value 의 개수를 곱한 후 -1 */
        for (String key : map.keySet()) {
            answer *= map.get(key).size();
        }

        return answer - 1;
    }
}

 

 

예제 분석

1) TestCase 1번의 경우

package com.algorithm._00_._Current;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Date 2022/03/27
 * @URL https://programmers.co.kr/learn/courses/30/lessons/42578
 */
public class P42578_위장 {
    Map<String, List<String>> map = new HashMap<>();

    public static void main(String[] args) {
	    // write your code here
        P42578_위장 main = new P42578_위장();

        String[][] a = new String[][] { {"yellowhat", "headgear"}, {"bluesunglasses", "eyewear"}, {"green_turban", "headgear"}};
        System.out.println(main.solution(a));
    }
	
    ...
}

 

위 solution() 메서드를 위 2차원 배열 a 를 매개변수로 호출했다. solution() 메서드 안에서 만들어진 map 은 아래와 같다.

 

map 의 최종 결과

 

 

key 는 '옷의 종류'다. value 는 그 key에 해당하는 옷의 개수만큼 들어가있다.

 

"0"이 들어간 이유

"0" 삽입을 제외한 map 의 모습

 

우선 스파이가 입을 수 있는 옷의 케이스는 아래와 같다.

 

value value
blue sunglasses 0
yellowhat 0
green_turban 0
yellowhat blue sunglasses
green_turban blue sunglasses

 

위 표를 보면, 옷의 종류별로 1개는 필수로 입어야한다. 그러므로 map 에 옷의 종류(key)가 처음 INSERT 될때 해당 key 에 해당하는 value(List)에 0을 INSERT 를 해주면 총 경우의 수를 구할 수 있다.

 

for (String key : map.keySet()) {
    answer *= map.get(key).size();
}

 

여기서 최종 결과는 -1 을 해줘야한다. 위 for 문을 통해 answer 에 최종 결과는 아래와 같다.

2 x 3 = 6
value value
0 0
blue sunglasses 0
yellowhat 0
green_turban 0
yellowhat blue sunglasses
green_turban blue sunglasses

 

map 의 최종 결과

 

(0, 0)의 경우는 제외되어야한다. 옷의 종류가 n 개일 경우 (0, 0, 0, ,,,n) n개만큼 모두 0인 경우를 제외해줘야 하기 때문에 - 1을 해준다. 

 

 

2) TestCase 2번의 경우

package com.algorithm._00_._Current;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Date 2022/03/27
 * @URL https://programmers.co.kr/learn/courses/30/lessons/42578
 */
public class P42578_위장 {
    Map<String, List<String>> map = new HashMap<>();

    public static void main(String[] args) {
	    // write your code here
        P42578_위장 main = new P42578_위장();

        String[][] b = new String[][] { {"crow_mask", "face"}, {"blue_sunglasses", "face"}, {"smoky_makeup", "face"}};
        System.out.println(main.solution(b));
    }
	
    ...
}

 

map 의 최종 결과

 

위 예제도 1)번의 경우와 동일하게 "0"을 포함한다. 경우의 수는 아래와 같다.

 

3
value value
crow_mask 0
blue_suglasses 0
smoky_makeup 0

 

이때도 (0, 0)의 경우는 제외해야 하므로 최종 결과에 -1 이다.

 

 

반응형

Designed by JB FACTORY