[프로그래머스] Lv2 - 위장

김멉덥·2022년 10월 9일
0

알고리즘 공부

목록 보기
5/171
post-thumbnail

문제

프로그래머스 코딩테스트 고득점 Kit - 해시

  • Lv 2. 위장 (Java)

문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

입출력 예

clothesreturn
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]5
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]]3

입출력 예 설명

1 ) 예제 #1

headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses

2 ) 예제 #2

face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

1. crow_mask
2. blue_sunglasses
3. smoky_makeup

코드 구현

import java.util.HashMap;
import java.util.Iterator;

class Solution {
   public int solution(String[][] clothes) {

      // 종류별로 옷의 개수를 저장할 HashMap 선언
      HashMap<String, Integer> map = new HashMap<>();

      // 옷을 종류별로 구분하기 -> [옷 종류, 개수]
      for (int i = 0; i < clothes.length; i++) {
          String clothesType = clothes[i][1];  // 옷의 종류는 clothes 배열에서 [i][1] 위치에 존재한다. -> clotheType 변수에 넣어주기

          if (map.get(clothesType) == null) {  // 만약 처음 보는 종류이면
              map.put(clothesType, 1);         // 개수는 1개
          } else {  // 처음 보는 종류가 아닌, map에 이미 있는 종류라면
              map.put(clothesType, (map.get(clothesType) + 1));   // 해당 종류의 옷의 개수 +1 증가해서 업데이트
          }
      }

      int answer = 1;

      // 옷 조합의 수 구하기
      for (String c : map.keySet()) { // 옷 종류들 = key 값, 해당 종류에 대한 개수 = value 값
          answer *= (map.get(c) + 1);   // 각 종류 별 옷의 개수를 곱해나감
					// map.get(c)+1에서 +1의 이유는 아무것도 없는 경우까지 포함하여 곱해야 하는데 map에는 반영이 안되어있기 때문
      }

      answer = answer - 1; // 모든 종류를 입지 않았을 때의 경우의 수 1 제거

      return answer;
  }
}

풀이

  • 입력되는 값 : [옷 이름, 옷 종류] ⇒ 옷의 종류가 겹치면 안되는 조합을 만들어 내야함

[a , 🔴][b , 🔴]
[c , 🟦]

이런식으로 있다면 입을 수 있는 방법은

🔴 : 안입기, a 입기, b 입기
🟦 : 안입기, c입기

  • 🔴 의 경우의 수 3개 * 🟦 의 경우의 수 2개 = 6개
  • 총 6개의 종류로 옷을 입을 수 있지만, 안입는 경우는 없고 최소 1개 이상은 입어야 하기 때문에
    (안입기, 안입기) 조합인 경우의 수 1 을 빼서 6 - 1 = 5

  • 이걸 식으로 하면,
    answer = 🔴 종류 옷의 개수 * 🟦 종류 옷의 개수 - 1
    - 각 종류별 옷의 개수를 곱하고 최종적으로 1을 빼준다.

  • 이를 위해 for문keySet() 을 사용하였다.

keySet() 사용하는 법

[Java] 자바 HashMap 사용법 & 예제 총정리

for(Integer i : map.keySet()){ //저장된 key값 확인
	System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

참고 자료

Java - HashMap 사용 방법 및 예제

profile
데굴데굴 뚝딱뚝딱 개발기록

0개의 댓글