프로그래머스 코딩테스트 고득점 Kit -
해시
- Lv 2. 위장 (Java)
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
clothes | return |
---|---|
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
1 ) 예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.
1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses
2 ) 예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.
1. crow_mask
2. blue_sunglasses
3. smoky_makeup
import java.util.HashMap;
import java.util.Iterator;
class Solution {
public int solution(String[][] clothes) {
// 종류별로 옷의 개수를 저장할 HashMap 선언
HashMap<String, Integer> map = new HashMap<>();
// 옷을 종류별로 구분하기 -> [옷 종류, 개수]
for (int i = 0; i < clothes.length; i++) {
String clothesType = clothes[i][1]; // 옷의 종류는 clothes 배열에서 [i][1] 위치에 존재한다. -> clotheType 변수에 넣어주기
if (map.get(clothesType) == null) { // 만약 처음 보는 종류이면
map.put(clothesType, 1); // 개수는 1개
} else { // 처음 보는 종류가 아닌, map에 이미 있는 종류라면
map.put(clothesType, (map.get(clothesType) + 1)); // 해당 종류의 옷의 개수 +1 증가해서 업데이트
}
}
int answer = 1;
// 옷 조합의 수 구하기
for (String c : map.keySet()) { // 옷 종류들 = key 값, 해당 종류에 대한 개수 = value 값
answer *= (map.get(c) + 1); // 각 종류 별 옷의 개수를 곱해나감
// map.get(c)+1에서 +1의 이유는 아무것도 없는 경우까지 포함하여 곱해야 하는데 map에는 반영이 안되어있기 때문
}
answer = answer - 1; // 모든 종류를 입지 않았을 때의 경우의 수 1 제거
return answer;
}
}
[a , 🔴][b , 🔴]
[c , 🟦]
이런식으로 있다면 입을 수 있는 방법은
🔴 : 안입기, a 입기, b 입기
🟦 : 안입기, c입기
- 🔴 의 경우의 수 3개 * 🟦 의 경우의 수 2개 = 6개
- 총 6개의 종류로 옷을 입을 수 있지만, 안입는 경우는 없고 최소 1개 이상은 입어야 하기 때문에
(안입기, 안입기) 조합인 경우의 수 1 을 빼서 6 - 1 = 5
- 이걸 식으로 하면,
answer = 🔴 종류 옷의 개수 * 🟦 종류 옷의 개수 - 1
- 각 종류별 옷의 개수를 곱하고 최종적으로 1을 빼준다.
- 이를 위해
for문
과keySet()
을 사용하였다.
keySet()
사용하는 법[Java] 자바 HashMap 사용법 & 예제 총정리
for(Integer i : map.keySet()){ //저장된 key값 확인
System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도