반응형
728x90
반응형
문제
https://programmers.co.kr/learn/courses/30/lessons/42578
풀이코드
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 은 아래와 같다.
key 는 '옷의 종류'다. value 는 그 key에 해당하는 옷의 개수만큼 들어가있다.
"0"이 들어간 이유
우선 스파이가 입을 수 있는 옷의 케이스는 아래와 같다.
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 |
blue sunglasses | 0 |
yellowhat | 0 |
green_turban | 0 |
yellowhat | blue sunglasses |
green_turban | blue sunglasses |
(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));
}
...
}
위 예제도 1)번의 경우와 동일하게 "0"을 포함한다. 경우의 수는 아래와 같다.
3
value | value |
crow_mask | 0 |
blue_suglasses | 0 |
smoky_makeup | 0 |
이때도 (0, 0)의 경우는 제외해야 하므로 최종 결과에 -1 이다.
반응형
'Algorithm > Problem Solving' 카테고리의 다른 글
[Baekjoon 2559번] 수열 문제 (with 자바) - 투포인터 알고리즘 (0) | 2022.04.10 |
---|---|
[Baekjoon 7576번] 토마토 문제 (with 자바) (0) | 2022.03.31 |
[프로그래머스] Level2 42885번: 구명보트 (JAVA) (0) | 2022.03.25 |
[프로그래머스] Level1 77484번: 로또의 최고 순위와 최저 순위 (JAVA) (0) | 2022.03.21 |
[Baekjoon 1238번] 파티 문제 (with 자바) (0) | 2022.03.15 |