반응형
풀이
- 해당 문제는 물론 재귀로 해서 문제를 해결할 수는 있지만
- 수학적 규칙이 보여서 고민해보다가
- 예전 수학 규칙이 생각남
- 우선 예를 들어 3개의 의상 종류가 있을 경우
- 모자 3개, 상의 2개, 바지 2개라고 할 경우
- 각각 1개씩 착용한 것, 2개씩, 3개씩 착용한 경우에 대한
- 모든 경우의 수를 더해야 하기에
- 착용하지 않은 수를 각 의상 별로 하나씩 추가
- 따라서 모자 4개, 상의 3개, 바지 3개로 생각 후
- 모든 경우의 수를 구해야 하므로 4*3*3을 하면 36개
- 단, 여기서 모든 것을 착용하지 않은 하나의 경우를 뺀다면 35개 식으로 구하기로 함
- 그래서 다음과 같이 코드를 작성
- 그리고 같은 이름의 의상은 없다고 했는데 체크 못해서... Set로 받은것...
import java.io.*;
import java.util.*;
public class _9375 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringTokenizer st;
static Map<String, Set<String>> dic;
public static void main(String[] args) throws IOException {
int T = Integer.parseInt(br.readLine());
while (T>0) {
dic = new HashMap<>();
int N = Integer.parseInt(br.readLine());
addMap(N);
bw.write(counting()+"\n");
T--;
}
bw.flush();
}
private static void addMap(int N) throws IOException {
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
String v = st.nextToken();
String k = st.nextToken();
if (!dic.containsKey(k)) dic.put(k,new HashSet<>(Arrays.asList(v)));
else dic.get(k).add(v);
}
}
private static int counting() {
int result = 1;
for (Set<String> li: dic.values()) result*=li.size()+1;
return result-1;
}
}
// 1 2 3
// 4 5
// 6 7
// 1 2 3 4 5 6 7 = 7
// 14 15 16 17, 24 25 26 27, 34 35 36 37, 46 47, 56 57 = 16
// 146 147 156 157, = 12
// 35 = > 7+12+(6+6+4)16
'알고리즘' 카테고리의 다른 글
[백준, 자바, 21736번] 헌내기는 친구가 필요해 (0) | 2024.12.06 |
---|---|
[백준, 자바, 17626번] Four Squares (0) | 2024.12.05 |
[백준, 자바, 1094번] 막대기 (0) | 2024.11.27 |
[백준, 자바, 1268번] 임시 반장 정하기 (0) | 2024.11.27 |
[백준, 자바, 11286번] 절댓값 힙 (0) | 2024.11.25 |