본문 바로가기
카테고리 없음

프로그래머스 - Lv.2 의상 자바

by 윤뇽뇽

 

프로그래머스

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

programmers.co.kr

1. SOLUTION

예전에 파이썬으로 풀었던 문제라 금방 풀었다. HashMap 사용!

 

옷을 입는 조합의 수만 구하면 되는 문제이기 때문에, 의상 이름을 전부 해시맵에 저장해줄 필요가 없다.

의상 종류별 개수를 해시맵에 저장해주고, 가능한 경우의 수를 곱해주면 된다.

종류별 아이템을 착용하거나 착용하지 않는 경우로 나누어지므로

각 종류별 아이템의 개수 + 1(해당 종류의 아이템을 착용하지않을 경우)을 곱해주면 모든 경우의 수를 구할 수 있다.

ex) 예제 1 : 모자 2개, 안경 1개

  • 모자 → 모자1착용/모자2착용/모자착용X (3)
  • 안경 → 안경1착용/안경착용X (2)
  • 모자 X 안경 = 3 x 2 = 6가지 경우의 수
  • 모자, 안경 모두 착용하지 않는 경우 -1 = 5가지

예제 1번처럼 모자 2개, 안경 1개가 있다면 모자 X 안경 = 3 x 2 = 6가지 경우의 수를 얻을 수 있지만,

최소 한 개의 의상을 입는다 는 조건을 만족하기 위해 모든 종류의 옷을 입지 않는 경우 1을 빼 주면 답을 구할 수 있다.

import java.util.*;
import java.util.Map.*;         // Map의 메서드 사용하려면 꼭 이렇게 가져와야함!

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String, Integer> hm = new HashMap<>();
        for (String[] cloth: clothes) {
            String name = cloth[0], c_type = cloth[1];
            hm.put(c_type, hm.getOrDefault(c_type, 0) + 1);
        }

getOrDefault 모듈을 사용해서 해시맵에 해당 키가 없을 경우 0을, 키가 있을 경우 value값을 가져와 +1을 해 주는

방식으로 종류별 아이템 개수를 카운트 해 줬다. (파이썬에서는 collections 모듈의 defaultDict 사용하면 됨)

        for (Entry<String, Integer> entry: hm.entrySet()) {
        // answer에 의상별 갯수+1(안입는 경우 포함) 곱해주기
            answer *= (entry.getValue() + 1);
        }
        // 옷을 모두 안 입는 경우 제외
        return answer - 1;
    }
}

지난번에 Lv.1 완주하지 못한 선수 풀이 했을 때 keySet()보다는 entrySet() 사용하는 게 좀 더 효율이 좋다고

기록했던 기억이 나서 entrySet을 사용해보았는데,

주의 해야할 점은 entrySet메서드를 사용하려면 import java.util.*; 만 해서는 안되고,

import java.util.Map.*; 로 메서드를 전부 import 해와야 한다는 것이다.

처음에 Map import를 안해와서 에러 뜸ㅋㅋ

2. CODE

import java.util.*;
import java.util.Map.*;         // Map의 메서드 사용하려면 꼭 이렇게 가져와야함!

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String, Integer> hm = new HashMap<>();
        for (String[] cloth: clothes) {
            String name = cloth[0], c_type = cloth[1];
            hm.put(c_type, hm.getOrDefault(c_type, 0) + 1);
        }
        for (Entry<String, Integer> entry: hm.entrySet()) {
        // answer에 의상별 갯수+1(안입는 경우 포함) 곱해주기
            answer *= (entry.getValue() + 1);
        }
        // 옷을 모두 안 입는 경우 제외
        return answer - 1;
    }
}

댓글