[Programmers] : 해시 > 위장 > JAVA

🔗 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

📝 풀이

종류별로 같은 이름의 옷은 없으므로 HashMap<종류(String),등장횟수(Integer)>을 이용하여 풀어보았습니다. 처음 등장하는 Key는 등장 횟수를 1로 설정하고, 그 이후 등장 부터는 기존 값에 1을 더하는 방식으로 구현하였습니다.

입을 수 있는 옷 종류의 수는 각 종류별로 선택할지 안 할지 여부(+1)를 포함하여 아래와 같은 방식으로 구할 수 있습니다. (A종류 옷 가지수 + 1)*(B종류 옷 가지수 + 1)*(C종류 옷 가지수 + 1) - 1

마지막의 -1은 아무것도 선택하지 않은 경우는 없어야하므로 제외 해준 것입니다.

코드로 구현할 때는 향상된 for문의 .values() 메소드를 활용하여 value 값을 간편하게 불러와 계산하였습니다.

 

💻 코드

public static int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String,Integer> m = new HashMap<>();

        for (int i = 0; i < clothes.length; i++) {
            String val = clothes[i][0];
            String key = clothes[i][1];

            if(m.containsKey(key)){
                m.put(key, ( m.get(key) + 1));
            }else{
                m.put(key, 1);
            }
        }

        System.out.println(m);
        System.out.println("size = " + m.size());

        for(String key : m.keySet()){
            answer *= (m.get(key) + 1);
        }


        return answer-1;
    }

💻 다른풀이

역시 스트림 공부 필수인듯...

import java.util.*;
import static java.util.stream.Collectors.*;

class Solution {
    public int solution(String[][] clothes) {
        return Arrays.stream(clothes)
                .collect(groupingBy(p -> p[1], mapping(p -> p[0], counting())))
                .values()
                .stream()
                .collect(reducing(1L, (x, y) -> x * (y + 1))).intValue() - 1;
    }
}

댓글

Designed by JB FACTORY