[Java] 프로그래머스 : 의상

728x90

[Java] 프로그래머스 : 의상

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


접근

 

HashMap으로 정리한다고 가정하면, 예제 1은 다음과 같이 정리된다.

headgear : ["yellow_hat", "green-turban"]
eyewear : ["blue-sunglasses"]

문제 조건에 의해 의상은 종류별로 1개씩만 입을 수 있고, 특정 종류의 옷을 입지 않는 것도 가능하다.

그러나 최소 한 개의 의상은 입어야 한다.

 

headgear에 대해 다음과 같은 경우의 수가 나타난다.

1. "yellow_hat"을 입는다.

2. "green_turban"을 입는다.

3. 아무것도 안입는다.

 

eyewear에 대해 다음과 같은 경우의 수가 나타난다.

1. "blue_sunglasses"를 입는다.

2. 아무것도 안입는다.

 

두 항목에 대해서의 모든 경우의 수는 3x2 = 6이 된다.

그러나 최소 한 개 이상의 옷을 입어야 하기 때문에 headgear-아무것도 안입는다, eyewear-아무것도 안입는다 의 경우를 제외해야 한다.

 

풀이1

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String, List<String>> map = new HashMap<>();
        
        for (String[] cloth: clothes) {
            String sort = cloth[1];
            List<String> keyCheck = map.get(sort);
            if (keyCheck == null) {
                keyCheck = new ArrayList<>();
                map.put(sort, keyCheck);
            }
            keyCheck.add(cloth[0]);
        }
        
        for (String key : map.keySet()) {
            answer *= map.get(key).size() + 1;
        }
        return answer - 1;
    }
}

 

풀이2

문제 조건에 따르면 같은 이름을 가진 의상은 존재하지 않기 때문에 map에서 의상에 대한 처리를 할 때 String 대신 Integer로 처리해도 상관이 없다.

경우의 수를 구하기 위해 해당 의상 종류에 몇 개의 의상이 있는지만 파악하면 되기 때문이다.

import java.util.*;

class Solution {
	public int solution(String[][] clothes) {
    	int answer = 1;
    	HashMap<String, Integer> map = new HashMap<>();
        
        for (String[] clothe : clothes) {
        	String sort = clothe[1];
            map.put(sort, map.getOrDefault(sort, 0) + 1);
        }
        
        Iterator<Integer> it = map.values().iterator();
        
        while(it.hasNext())
        	answer *= it.next().intValue() + 1;
        
        return answer - 1;
    }
}
728x90