문제설명
입력 & 출력
나의 풀이
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String,Integer> map = new HashMap<>();
for(int i = 0 ; i < clothes.length ; i++){
String type = clothes[i][1];
map.put(type,map.getOrDefault(type,0) + 1);
}
for(int val : map.values()){
answer *= val + 1;
}
return answer-1;
}
}
이번 문제는 옷의 종류와 각 종류별 옷의 개수가 주어졌을 때, 가능한 모든 의상 조합의 수를 구하는 문제입니다.
처음에는 만약 바지를 안 입는 경우가 있다고?⁉라고 생각해서 문제가 이해가 잘 안 됐습니다.
이번 문제의 핵심이라고 생각합니다. 코니는 하루에 한 개의 의상은 꼭 입는답니다.
즉 아무것도 안 입는 경우는 없고, 옷의 종류 중 안입는 의상도 있습니다.
의상의 종류 | 의상 개수 |
headgear | A,B (총 2개) |
eyewear | a (총 1개) |
예제#1을 표로 표현하자면 위와 같습니다.
- headgear는 총 2개
- A를 입는다.
- B를 입는다.
- 안 입는다.
- eyewear는 총 1개
- a를 입는다.
- 안 입는다.
문제를 보면 각 옷의 종류는 중복될 수 있지만, 각 옷의 개수는 중복되지 않아야 합니다. 따라서 HashMap을 사용하기에 적합한 문제입니다.
옷의 종류를 key로 사용하기 위하여 자료형을 String으로 하고, 각 옷의 개수를 Integer형으로 HashMap을 초기화해줍니다.
각 옷의 종류를 순회하는 데 1번째 요소를 key로 지정해 주고, 0번째 요소를 getOrDefault() 메서드를 사용하여 key값이 중복될 때마다 1씩 추가해 줍니다.
그러면 다음과 같이 {eyewear=1, headgear=2} HashMap가 형성되고, HashMap의 values() 메서드를 사용하여 HashMap의 value값을 가져옵니다.
그리고 위에서 설명한 조합인 각 옷의 종류의 +1을 해준 값을 answer변수에 곱해줍니다.
answer에는 총조합의 개수는 3 X 2 = 6이 저장됩니다. 그러나 이 조합에는 headgear와 eyewear 둘 다 안 입는 경우가 포함되어 있습니다. 따라서 이 조합을 1개 빼줘야 합니다.
참고 ❗
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.2 프로세스 (PriorityQueue, poll(), offer() ,Java) (1) | 2024.06.16 |
---|---|
[프로그래머스] Lv.2 기능개발 (큐 Queue, peek(), offer(), ArrayList, Java) (1) | 2024.06.15 |
[프로그래머스] Lv.2 튜플 (LinkedHashSet, replaceAll, substring, Java) (0) | 2024.06.15 |
[프로그래머스] Lv.1 다트게임 (StringBuilder, isDigit(), isLetter(),Java) (1) | 2024.06.14 |
[프로그래머스] Lv.1 소수 만들기 (브루트 포스 알고리즘, Java) (1) | 2024.06.14 |