문제 링크
문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
문제 결과
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
접근 방법
- 의상의 종류를 Key값으로 가지며 경우의 수를 구하기 위해 의상의 종류마다 몇 개에 의상을 가지고 있는지를 value로 가지고 있는 HashMap을 만들었습니다.
- 반복문을 통하여 새로운 의상의 종류이면 0, 원래 있던 의상이면 해당하는 값을 가져와서 +1을 실행하여 HashMap에 입력해주었습니다. getOrDefault()를 사용하였습니다.
- 의상을 최소 하나는 입어야 하는 경우의 수을 찾아 출력을 해야한다. 경우의 수를 구하는 규칙은
- 의상 종류에 해당하는 개수에 +1 => spy.get(key)+1
- 의상 종류마다 +1한 값을 모두 곱한다. =>answer *= (spy.get(key)+1)
- 마지막으로 아무것도 입지 않은 경우를 제거해야하기 때문에 1을 빼준다. => answer -= 1
Ex) 상의(주황색 티셔츠, 파랑색 티셔츠), 하의(청바지, 반바지), 눈(선글라스)일때
- HashMap에 저장되는 값은 Key: 상의 value:2, Key:하의 value:2, Key:눈 value:1
- 경우의 수 규칙 적용시키면 상의(3) 하의(3) 눈(2)
- 모두 곱한다. => 3*3*2 = 18
- 아무것도 입지 않은 경우를 위해 1을 뺀다.=> 18-1 = 17
- 경우의 수는 17개이다.
- 규칙을 반복문을 통해 적용시켜서 결과를 answer에 저장하여 출력하였습니다.
결과 코드
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
HashMap<String,Integer> spy = new HashMap<>(); //종류별 HashMap형성
int answer = 1;
for(int i=0;i<clothes.length;i++) {
spy.put(clothes[i][1], spy.getOrDefault(clothes[i][1], 0)+1);
//clothes에 있는 종류별 갯수를 저장
}
for(String key : spy.keySet()) {
answer *= (spy.get(key)+1);
//경우의 수 계산
}
answer -=1; //마지막 아무것도 입지 않았을 경우 빼기
return answer;
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 숫자 큰값/작은값 비교하기 Math.max/Math.min (0) | 2022.01.04 |
---|---|
[JAVA] 숫자 제곱근(루트) 구하는 방법 Math.sqrt() (0) | 2022.01.02 |
[JAVA] 큰 정수(숫자) 다루는 방법 BigInteger (0) | 2021.12.31 |
프로그래머스 코딩테스트 연습 (Hash) 전화번호 목록도움말 (0) | 2021.11.16 |
프로그래머스 코딩테스트 연습 (Hash) 완주하지 못한 선수 (0) | 2021.11.15 |
댓글