본문 바로가기

Algorithm/Study

[프로그래머스] 코딩테스트 연습 : 해시 > 위장

문제 : 

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

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

종류 이름

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

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

자세한 문제는 링크를 참조하세요.

입출력 예

출처 : 프로그래머스

해결방법 

경우의 수로 접근하였다.

모든 경우의 수 - 전부 다 없는 경우

모든 경우의 수를 구하는 설명

Point 장착하지 않는 경우 :

모든 종목 중에 한 종목만 장착해도 된다 함은 전체 경우의 수에서 모두 장착하지 않는 경우를 제거해주면 된다.

 

즉, 들어온 들어온 종목의 개수에 + 1을 하여 각 종목들을 곱해주면 전체 경우의 수가 나오고,

잊지 말고 마지막에 -1을 해줘야 한다.

 

공식으로 나타내 보면,

m: 얼굴에 들어온  품목의 개수

n : 상의에 들어온 품목의 개수k :  하의에 들어온 품목의 개수

answer = (m+1)(n+1)(k+1) - 1

코드로 확인해 보자

1.PYTHON VERSION

def solution(clothes):
    answer = 1
    dict = {} // 딕셔너리에 value가 여러개인 구조로 만들었다.
    for element in clothes:
        if element[1] not in dict:
            dict[element[1]]=[] // 없으면 value에 리스트로 만들고 있으면 더하는 방식
        dict[element[1]].append(element[0])
    for key, value in dict.items():
        answer *= len(value)+1
    return answer - 1

2. JAVA VERSION

처음엔,  value 값을 숫자가 아닌 String []으로 접근했는데 자료 구조를 다루는 것이 쉽지 않았다.

어차피 우리가 필요한 것은 각 키 별로 value의 개수 이므로 다루기 쉬운 방식으로 접근해보았다.

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        int value = 1;
        Map<String, Integer> hm = new HashMap<>();
        for (String[] col: clothes){
            if(hm.containsKey(col[1])){// 키가 있으면 키값을 가져와서 1을 더해서 value에 넣어줬다.
                int flag = hm.get(col[1]) + 1;
                hm.put(col[1], flag);
            }
            hm.putIfAbsent(col[1], value);// 키가 없으면 1을 넣고
        }
        for(Integer i : hm.values()){// 값을 answer 에 곱해준다.
            answer *= i+1;
        }
        return answer - 1;
    }
}