소소한 개발이야기
[Programmers 문제풀이 JAVA] Level 2 위장 본문
📄 위장
🔗 문제 풀러가기
문제는 HashMap을 이용해 해결하였습니다. 문제의 의도는 도둑이 가진 옷의 이름과 옷의 종류(category) 가 주어지고, 여기서 도둑이 입을 수 있는 옷의 경우의 수를 구하는 문제 입니다. 문제의 조건을 보면 다음과 같습니다.
- 매일 입는 옷은 달라야 한다.
- 옷을 입거나 안입는 경우도 있다.
- 적어도 1개 이상의 옷은 입어야 한다.
처음 문제를 접근할 때 방향을 잘 잡아야 하는데 문제를 천천히 읽어보면 옷의 이름은 중요하지 않습니다. 문제에서 가장 중요한 부분은 옷의 종류별 갯수 입니다. 예제를 보면서 천천히 설명해보겠습니다.
예제 1
상의 : 반팔, 긴팔
하의 : 청바지, 반바지, 슬랙스
위의 예제를 보면 상의 2개, 하의 3개입니다. 문제에서 제시하는 것은 도둑이 어떤 옷을 입는지가 아니라 주어진 옷을 입을 수 있는 경우의수입니다. 따라서 옷의 종류별 갯수만 알고 있다면 입을 수 있는 경우의 수를 구할 수 있습니다. 각 옷의 종류를 입는 경우의 수를 살펴보면 다음과 같습니다.
상의를 입는 경우의 수
1. 반팔
2. 긴팔
3. 입지 않는다
하의를 입는 경우의 수
1. 청바지
2. 반바지
3. 슬랙스
4. 입지 않는다
여기서 중요한 점은 모든 옷의 종류에서 입지 않는 경우도 함께 포함되어 있습니다. 따라서 가진 옷중 입을 수 있는 경우의 수는 (상의 갯수 + 1) * (하의 갯수 + 1)입니다. 하지만 여기서 주의해야 할 점이 있는데 문제의 조건 중 '적어도 1개 이상의 옷은 입는다' 라는 내용이 있기 때문에 구한 모든 경우의 수에서 아무것도 입지 않은 경우의 수 1가지를 빼줘야 합니다. 즉 (상의 갯수 + 1) * (하의 갯수 + 1) - 1
이 정답이 됩니다. 만약 모자라는 카테고리가 1개 더 생긴다면 (상의 갯수 + 1) * (하의 갯수 + 1) * (모자 갯수 + 1) - 1
이 정답이 됩니다.
글보단 소스코드를 보면 쉽게 이해할 수 있습니다.
🌱 Solution 함수
옷의 종류별 갯수를 받아 경우의 수를 계산합니다.
public int solution(String[][] clothes) {
HashMap<String, Integer> categories = categorizeClothes(clothes);
int answer = 1;
for (Integer value : categories.values())
answer *= (value + 1);
answer -= 1;
return answer;
}
🌱 categorizeClothes 함수
옷의 종류별 갯수를 HashMap으로 만들어 반환하는 함수입니다.
private HashMap<String, Integer> categorizeClothes(String[][] clothes) {
HashMap<String, Integer> categories = new HashMap<>();
for (int i = 0; i < clothes.length; i++) {
String categoryName = clothes[i][1];
if (categories.containsKey(categoryName))
categories.replace(categoryName, categories.get(categoryName) + 1);
else
categories.put(categoryName, 1);
}
return categories;
}
💡 Github에 더 많은 문제 풀이가 있습니다.
'Programmers' 카테고리의 다른 글
[Programmers 문제풀이 JAVA] 다트 게임 (0) | 2019.06.24 |
---|---|
[Programmers 문제풀이 JAVA] Level 5 비밀지도 (2017 카카오 블라인드) (0) | 2019.06.06 |
[Programmers 문제풀이 JAVA] Level 2 가장 큰 수 (0) | 2019.06.05 |
[Programmers 문제풀이 JAVA] Level 2 전화번호 목록 (0) | 2019.06.02 |
[Programmers 문제풀이 JAVA] Level 2 더 맵게 (0) | 2019.05.30 |