안녕하세요, 스코리아입니다.
오늘은 자바(Java)의 Hash(해시)를 이용한 프로그래머스 Lv.2 의상 문제를 풀어보겠습니다.
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/42578
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 각 종류별로 최대 1가지 의상만 착용 가능
- 착용할 수 있는 의상의 경우의 수를 구하는 문제
- 아예 옷을 안 입는 경우는 없음 (최소 1개의 의상은 입음)
- [의상의 이름, 의상의 종류]로 이루어진 clothes 배열이 주어짐
- 같은 이름을 가진 의상은 존재하지 않음
문제에 나와있는 예시를 토대로 설명해 보겠습니다.
clothes (옷) | return (경우의 수) |
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
- 의상의 종류에 따라 분류에 해보기: "headgear"에 해당하는 의상이 yellow_hat, green_turban이고 "eyewear"에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능
- yellow_hat
- blue_sunglasses
- green_turban
- yellow_hat + blue_sunglasses
- green_turban + blue_sunglasses
- 경우의 수만 구하면 되는 문제로, 의상의 종류에 따른 의상 개수는 중요하지만 의상의 이름은 중요하지 않습니다.
풀이 과정
우선 다음과 같은 경우를 생각해 봅시다.
- "headgear"에 의상이 2개, "eyewear"에 의상이 3개, "face"에 의상이 4개 있다고 합니다.
- 우리는 해당 의상 종류의 의상을 입지 않는 경우도 생각해야 합니다.
- 경우의 수를 구하기 위해 "안 입는 경우"를 1개의 경우로 생각하여 의상의 종류에 따른 의상의 개수에 1씩 더해줍니다.
- 그러면 각각 3, 4, 5가 될 것입니다.
- 3*4*5 = 60으로 경우의 수를 구합니다. 다만, 여기서 의상을 아예 안 입는 경우는 없으니 -1을 해주어야 합니다.
- 따라서 60-1 = 59가 정답이 됩니다.
위의 예시를 토대로 설명한 대로, HashMap을 이용하여 풀이하였습니다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String, Integer> map = new HashMap<>();
for(String c[] : clothes){
map.put(c[1], map.getOrDefault(c[1], 0) + 1);
}
/**
headgear
2개 + 안입는경우 = 3
eyewear
3개 + 안입는경우 = 4
face
4개 + 안입는경우 = 5
=> 3*4*5
*/
for(String s : map.keySet()){
answer *= map.get(s) + 1; // 안입는 경우 + 1
}
return answer-1; // 아예 안입는 경우는 없으니, -1
}
}
- key 값은 의상 종류의 이름(String)을, value 값에는 의상 종류에 따른 의상의 개수(Integer)를 저장하는 HashMap을 생성하였습니다.
- clothes 배열에 대해 for문을 돌려서, c[1] (의상 종류 이름)을 key 값으로 하고, 의상 종류가 없으면 1을 넣고, 의상 종류가 있으면 그 값에 1을 더해서 넣었습니다.
- map.keySet()을 이용하여 map에 대한 for문을 돌리고 해당 value 값에 안 입는 경우의 수 1개를 더하여 answer에 누적적으로 곱해주었습니다.
- 마지막으로 아무것도 안 입는 경우는 없으므로 answer에 1을 빼주었습니다.
실행 결과
- 대부분의 테스트는 0~1ms 정도로, 비교적 빠른 모습입니다.
지금까지 자바(Java) 해시를 이용한 프로그래머스 '의상' 문제에 대해서 알아보았습니다.
읽어주셔서, 감사합니다.
'JAVA > 문제 풀이' 카테고리의 다른 글
[프로그래머스] 여행 경로 문제 (Java DFS 풀이) (1) | 2024.06.30 |
---|---|
[프로그래머스] 완주하지 못한 선수 문제 (Java Hash 풀이) (3) | 2023.08.27 |
[프로그래머스] 베스트앨범 문제 (Java Hash 풀이) (2) | 2023.08.20 |
[프로그래머스] 다리를 지나는 트럭 문제 (Java Queue 풀이) (5) | 2023.08.13 |