문제 출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWgv9va6HnkDFAW0&categoryId=AWgv9va6HnkDFAW0&categoryType=CODE&problemTitle=%EA%B7%9C%EC%98%81%EC%9D%B4&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution {
private static boolean[] isSelected = new boolean[9];
private static int[] selected = new int[9];
private static int win, lose;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(reader.readLine());
StringBuilder sb = new StringBuilder();
int problemNum = 1;
while (T-- > 0) {
win = 0;
lose = 0;
int[] temp = new int[19];
for (int i = 1; i < 19; i++) {
temp[i] = i;
}
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int[] nums = new int[9];
for (int i = 0; i < 9; i++) {
nums[i] = Integer.parseInt(tokenizer.nextToken());
temp[nums[i]] = 0;
}
Arrays.sort(nums);
int index = 0;
int[] target = new int[9];
for (int i = 1; i < 19; i++) {
if (temp[i] != 0) target[index++] = temp[i];
}
permutation(nums, target, 0);
sb.append("#").append(problemNum++).append(" ");
sb.append(win).append(" ").append(lose).append("\n");
}
System.out.println(sb);
}
private static void permutation(int[] nums, int[] target, int count) {
if (count == 9) {
int sumFirst = 0, sumSecond = 0;
for (int i = 0; i < nums.length; i++) {
int temp = nums[i] + selected[i];
if (nums[i] > selected[i]) sumFirst += temp;
else sumSecond += temp;
}
if (sumFirst > sumSecond) win++;
else if (sumFirst < sumSecond) lose++;
}
for (int i = 0; i < target.length; i++) {
if (!isSelected[i]) {
isSelected[i] = true;
selected[count] = target[i];
permutation(nums, target, count + 1);
isSelected[i] = false;
}
}
}
}
- 기본적인 로직은 순열을 이용한 것이다.
- 먼저 인영이가 가진 카드 정보를 가진 배열을 만든다.
- 인영이가 가진 카드는 9장이므로 9!의 경우의 수가 나온다. 순열 메서드를 통해 모든 경우의 수를 찾고 각 경우 별 승자를 기록한다.