소소한 개발이야기

[Programmers 문제풀이 JAVA] Level 2 위장 본문

Programmers

[Programmers 문제풀이 JAVA] Level 2 위장

plplim 2019. 6. 6. 22:06

 

📄 위장

🔗 문제 풀러가기


문제는 HashMap을 이용해 해결하였습니다. 문제의 의도는 도둑이 가진 옷의 이름옷의 종류(category) 가 주어지고, 여기서 도둑이 입을 수 있는 옷의 경우의 수를 구하는 문제 입니다. 문제의 조건을 보면 다음과 같습니다.

  1. 매일 입는 옷은 달라야 한다.
  2. 옷을 입거나 안입는 경우도 있다.
  3. 적어도 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 문제 풀이

BaekJoon Online Judge 문제 풀이

Comments