728x90
🔗 문제 링크
📂 분류
해시
, 조합
💡 풀이
처음 풀이는 부분 집합과 경우의 수를 구하는 공식을 이용하여 접근해서 풀었다. 하지만 이렇게 풀었더니 1번 테스트케이스만 시간 초과가 떠서 만점을 받지 못했다.
시간을 어떻게 줄여야할지 생각이 나지않아서 질문하기를 참고했는데 모든 조합을 구할 필요 없이 안입는 경우를 더해 경우의 수를 구하면 됐다.
풀이 과정
- 주어진
clothes
메서드를 의상 종류를key
로 두고value
는 해당하는key
의 개수로 둬서Map
에 저장한다. - 각 해당하는 의상 종류의 개수를 +1 해주고 경우의 수를 구한다.
- 모든 옷을 안입는 경우는 없으니 return할땐 -1을 해준다.
💻 코드
- 만점 코드
import java.util.*;
class Solution {
static Map<String, Integer> map = new HashMap<>();
public int solution(String[][] clothes) {
initialize(clothes);
int answer = 1;
for (Map.Entry<String, Integer> it : map.entrySet()) {
answer *= it.getValue();
}
return answer - 1;
}
void initialize(String[][] clothes) {
for (String[] str : clothes) {
String key = str[1];
if (map.containsKey(key)) {
map.replace(key, map.get(key) + 1);
} else {
map.put(key, 2);
}
}
}
}
- 테스트케이스 1번 시간초과 코드 (부분 집합 이용)
import java.util.*;
class Solution {
static Map<String, Integer> map = new HashMap<>();
static ArrayList<String> typeOfClothes = new ArrayList<>();
public int solution(String[][] clothes) {
initialize(clothes);
int answer = 0, len = typeOfClothes.size();
for (int i = 0; i < (1 << len); i++) {
ArrayList<Integer> powerSet = new ArrayList<>();
for (int j = 0; j < len; j++) {
if ((i & (1 << j)) != 0) {
powerSet.add(j);
}
}
int count = 1;
for (int e : powerSet) {
String key = typeOfClothes.get(e);
count *= map.get(key);
}
answer += count;
}
return answer - 1;
}
void initialize(String[][] clothes) {
for (String[] str : clothes) {
String key = str[1];
if (map.containsKey(key)) {
map.replace(key, map.get(key) + 1);
} else {
map.put(key, 1);
}
}
map.forEach((key, value) -> {
typeOfClothes.add(key);
});
}
}
728x90
'Algorithm > 프로그래머스' 카테고리의 다른 글
[c++] 프로그래머스 - 빛의 경로 사이클 (Level 2) (0) | 2022.02.10 |
---|---|
[c++] 프로그래머스 - 신고 결과 받기 (2022 KAKAO BLIND RECRUITMENT) (0) | 2022.02.09 |
[C++] 프로그래머스 - 더 맵게 (Level 2) (0) | 2022.02.09 |
[자바] 프로그래머스 - H-Index (Level 2) (0) | 2022.02.09 |
[자바] 프로그래머스 - 다리를 지나는 트럭 (0) | 2022.02.07 |