공부/알고리즘, 자료구조

[프로그래머스] 위장

오잎 클로버 2022. 2. 10. 08:30
728x90

 해당 문제의 링크는 여기입니다. 

public int solution(String[][] clothes) {
    HashMap<String, Integer> parts = new HashMap<>();

    for (String[] clothe : clothes) {
        String key = clothe[1];
        parts.put(key, parts.getOrDefault(key, 0) + 1);
    }

    int answer = 1;

    for (Map.Entry<String, Integer> entry : parts.entrySet()) {
        answer *= entry.getValue() + 1;
    }

    return answer - 1;
}

HashMap를 사용하여 풀었습니다.

각 위치에 따른 원소가 몇 개인지만 파악하면 금방 풀 수 있기에 getOrDefault를 사용하였습니다.

 

getOrDefault는 map에 이미 해당 키가 있다면 값을 받고 아니라면 default 값을 반환해주는 메소드입니다.

 

map에 값을 추가할 때마다 value에 +1씩 계속 추가해서 총 갯수를 파악하고

각 key가 가지고 있는 value의 갯수가 정해지면

1씩 더해준 뒤 모두 곱합니다.

그리고 마지막에 -1를 빼주면 됩니다.

 

원리는 단순합니다.

예시를 들자면

value가 3개인 key와 value가 2개인 key가 있다면 

3개짜리 key에서는 각자의 원소와 아예 안 뽑는 경우까지

4가지 경우가 있습니다.

그리고 2개짜리 key에서도 마찬가지로 3가지 경우의 수가 생깁니다.

이때, 둘 다 뽑지않는 경우 역시 포함하게 되는 데

이는 해당 문제에서 최소 한 개이상 있어야하므로 해당 경우의 수를 없애기 위해 -1를 합니다.

 

 

이상입니다.