개발저장소

[프로그래머스 Level 2] 의상 본문

Coding Test/Programmers

[프로그래머스 Level 2] 의상

개발소 2023. 11. 13. 01:59

문제

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이

  • 각 종류별로 최대 하나의 의상만 입을 수 있다. 예를 들어 얼굴에 해당하는 부위에 안경과 선글라스를 모두 착용하는 것은 불가능하다.
  • 착용한 의상이 일부 겹치더라도 다른 의상이 겹치지 않거나 추가된다면 다른 옷을 착용한 것으로 한다.
  • 최소 하나의 의상은 입게 된다. 즉, 아무 것도 입지 않는 경우를 제외하고 모든 경우를 구해야 한다.

각 종류의 의상 개수를 구해야 한다. 의상 종류를 String 자료형의 key로 가지고, 개수를 Integer 자료형의 value로 가지는 HashMap 자료구조를 만들어 풀었다.

HashMap<String, Integer> map = new HashMap<>();

 

clothes 배열을 탐색하며 처음 map에 입력한다면 put, 이미 존재한다면 containsKey로 확인 후 replace 해준다.

for(int i = 0; i < clothes.length; i++){
    String type = clothes[i][1];
    if(map.containsKey(type)){
        map.replace(type, map.get(type) + 1);
    } else {
        map.put(type, 1);
    }
}

 

마지막 조건에서 최소 하나의 옷은 입게 된다는 것은 모든 경우의 수에서 옷을 입지 않은 경우만 빼면 된다.

각 종류의 의상 개수에 입지 않은 경우를 포함하여 계산한 후 아무 것도 입지 않은 경우인 1을 뺀다.

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

 

 

전체 코드 (Java)

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        HashMap<String, Integer> map = new HashMap<>();
        
        for(int i = 0; i < clothes.length; i++){
            String type = clothes[i][1];
            if(map.containsKey(type)){
                map.replace(type, map.get(type) + 1);
            } else {
                map.put(type, 1);
            }
        }
        
        System.out.println(map);
        
        int answer = 1;
        for(String key : map.keySet()){
            answer *= ( map.get(key) + 1 );
        }
        
        return answer - 1;
    }
}

 

 

후기

전체 경우의 수에서 1을 빼는 연산을 빠르게 생각하지 못해서 오래 걸렸다. 또 keySet() 또는 entrySet()을 다시 공부하며 Map을 다루는 법에 익숙해졌다.