https://school.programmers.co.kr/learn/courses/30/lessons/42578
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
조건
제한시간 45분 이내
처음에 문제를 어렵게 생각했다.
주어진 데이터에 맞게 위장할 수 있는 의상을 중복되지 않게 조합을 해서 해당 조합이 몇 개 인지를 찾는 문제다.
그냥 갯수만 풀면 되는 문제였는데
문제를 정말 꼬아서 생각해서 dfs를 돌려 조합을 맞춰야하는 지 알았다.
생각해보니 처음 생각한 방법은 복잡해져서 문제에서 요구하는 바가 아닌 거 같고, 조합할 수 있는 의상 갯수를 묻는 문제니 갯수만 체크를 해주어 풀수 있다고 생각을 했다.
그래서 다시 생각을 해보면
이 문제는 수의 공식을 알면 쉽게 풀수 있었다.
얼굴 2개 (동그란 안경, 선글라스)
상의 1개 (파란색 티셔츠)
하의 1개 (청바지)
겉옷 1개 (긴 코트)
라고 하면?
(얼굴+1) * (상의+1) * (하의+1) * (겉옷+1) - (아무것도 입지 않는 수) = ?
+1를 해주는 이유는,
예시로 상의와 하의 두 가지 의상 종류가 있을 때? 상의만 택하고 하의를 택하지 않을 수도, 하의를 택하고 상의를 택하지 않을 수도 있기 때문에 각 종류별로 +1를 해주는 것이다.
이렇게 조합은 (2+1) * (1+1) * (1+1) * (1+1) - 1 = 35개
HashMap 이라는 자료구조를 사용해서,
getOrDefault 를 이용해서, 중복된 의상종류의 갯수를 HashMap에 value 값으로 저장하는 방식을 고안했다.
사실 이게 끝이다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String, Integer> arangedClothes = new HashMap<>();
for (int i = 0; i < clothes.length; i++) {
String key = clothes[i][1];
arangedClothes.put(key, arangedClothes.getOrDefault(key, 1) + 1);
}
System.out.println(arangedClothes);
for (String key : arangedClothes.keySet()) {
answer *= arangedClothes.get(key);
}
return answer - 1;
}
}
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스 *Java] - 큰 수 만들기 (0) | 2022.07.23 |
---|---|
[프로그래머스 *Java] - 카펫 (0) | 2022.07.21 |
[프로그래머스 *Java] - H-Index (0) | 2022.07.20 |
[프로그래머스 *Java] - 2 x n 타일링 (0) | 2022.07.18 |
[프로그래머스 *Java] - 배달 (0) | 2022.07.16 |