https://www.acmicpc.net/problem/28094
1. 아이디어
T와 N을 작고 M은 큰 조건이다. 심사위원의 평가 개수가 작품이 최대 10개임에도 최대 30000가지이므로 작품의 순서가 중복되는 상황이 있다고 생각해서 이를 카운팅 배열로 한번에 기록했다. 이후 순열을 돌리며 각 조합에서 점수 합의 최댓값을 찾고 개수도 찾았다.
2. 문제풀이
순열 메서드를 생성 후 순열이 생성되면 카운팅 배열을 통해 점수 합을 계산하는 걸 반복하는 방식으로 구현했다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
private static int N;
private static boolean[] visited;
private static int[] sel;
private static int[][] map;
private static int max;
private static int cnt;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
map = new int[1 + N][1 + N];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
map[A][B] += V;
}
visited = new boolean[1 + N];
sel = new int[1 + N];
max = 0;
cnt = 0;
permutation(1);
sb.append(max).append(" ").append(cnt).append("\n");
}
bw.write(sb.toString());
bw.flush();
}
private static void permutation(int selIdx) {
if (selIdx == sel.length) {
int sum = 0;
for (int i = 1; i <= N - 1; i++) {
for (int j = i + 1; j <= N; j++) {
sum += map[sel[i]][sel[j]];
}
}
if (sum > max) {
max = sum;
cnt = 1;
} else if (sum == max) {
cnt++;
}
}
for (int i = 1; i <= N; i++) {
if (visited[i]) continue;
sel[selIdx] = i;
visited[i] = true;
permutation(selIdx + 1);
visited[i] = false;
}
}
}
4. 후기
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 16200번 - 해커톤 [Java] (0) | 2025.01.22 |
---|---|
[백준] 29198번 - 이번에는 C번이 문자열 [Java] (0) | 2025.01.22 |
[백준] 23797번 - 개구리 [Java] (0) | 2025.01.22 |
[백준] 28113번 - 정보섬의 대중교통 [Java] (0) | 2025.01.22 |
[백준] 16394번 - 홍익대학교 [Java] (0) | 2025.01.22 |