프로그래머스 - 위장

TaeYang Lim·2020년 1월 17일
5
post-thumbnail

오늘 오랜만에 알고리즘 사이트에 접속해 알고리즘을 풀어보았고 내가 풀었던 해답을 포스팅 하려고 합니다.
다른 좋은 방법이 있다면 댓글로 소통을 할 수 있으면 좋을거 같습니다!.

위장 - 프로그래머스


문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

입 출력 예

CLOTHESRETURN
[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]]5
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]]3

풀이

    public int solution(String[][] clothes) {
       int answer = 1;

        Map<String, Integer> clothesMap = new HashMap<>(); // 종류 : 갯수

        for (int i = 0; i < clothes.length; i++) {
            // 종류 여부 판단. 같은 종류 일 경우 Value + 1
            clothesMap.put(clothes[i][1], clothesMap.getOrDefault(clothes[i][1], 0)+1);
        }

        // 경우의 수 체크 answer *= (옷 가지수 + 안 입을 경우)
        for (int val : clothesMap.values()){
            answer *= (val+1);
        }

        // 모두 다 안입는 경우는 존재하지 않으므로 -1
        return answer-1;
    }

우선 이 문제는 해시맵을 이용해서 풀었습니다.
해시 맵에 종류 : 갯수의 형태로 저장을 하여서 마지막에 경우의 수를 계산했는데,
첫번째 예제를 예로 들자면, headgear : 2, eyewear : 1 이렇게 해시 맵에 저장되게 됩니다.

그럼 경우의 수는 어떻게 계산해야 할까요?

제가 푼 방법은 다음과 같습니다.
1. (headgear의 수 + 1) 1을 더 해주는 이유는 headgear를 착용하지 않을 수도 있기 때문입니다.
2. (eyewear의 수 + 1 ) 1을 더 해주는 이유는 eyewear를 착용하지 않을 수도 있기 때문입니다.
3. 두 수는 각각 독립적이기 때문에 1번 2번의 수를 곱하고 - 1 (모두 안입는 경우는 존재하지 않으므로)

getOrDefault 메소드는 첫번째 인자의 값이 Map에 존재하지 않는다면 Default로 설정한 값으로 가져오게 됩니다. NULL을 방지하기 위해 사용하였습니다.

profile
Java & Backend Developer

1개의 댓글

comment-user-thumbnail
2021년 8월 9일

안 입는 경우를 생각해서 +1 한다는 건 대체 ..어떻게 생각하신 건가요... 제가 개발자 머리가 아닌걸까요.

답글 달기