https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWgv9va6HnkDFAW0
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
//https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWgv9va6HnkDFAW0
public class Solution {
static boolean[] isSelected;
static int[] numbers;
static int[] in;
static int answer;
static int[] gyu;
static int count; //총 경기 횟수
static int draw; // 비긴 횟수
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int T=Integer.parseInt(st.nextToken());
gyu=new int[9]; //규영이의 카드 번호를 나타내는 배열
in=new int[9]; //인영이의 카드 번호를 나타내는 배열
isSelected=new boolean[9]; //인영이의 카드번호 순열을 위한 checked 배열
numbers=new int[9];
boolean[] card=new boolean[19]; //카드 번호는 1부터 19까지.
//테스트케이스의 수만큼 반복
for(int tc=0;tc<T;tc++){
Arrays.fill(card,false);
st=new StringTokenizer(br.readLine());
//규영이의 카드 번호를 입력받는다.
for (int i = 0; i < gyu.length; i++) {
gyu[i]=Integer.parseInt(st.nextToken());
card[gyu[i]]=true;
}
//인영이의 카드 번호를 알아낸다.
int tmp=0;
for (int i = 1; i <= 18; i++) {
if(!card[i]){
in[tmp++]=i;
}
}
count=0;
answer=0; //
draw=0;
Arrays.fill(isSelected,false);
permut(0);
System.out.printf("#%d ",tc+1);
System.out.println((answer)+" "+(count-draw-answer));
//규영이가 이기는경우, 지는경우 출력
}
}
private static void permut(int cnt) {
if(cnt==9){
count++;
int sumG=0; //규영이 점수 합
int sumI=0; //인영이 점수 합
for(int i=0;i<9;i++){
//인영이와 규영이의 카드를 비교하고 sum을 계산한다.
if(gyu[i]<numbers[i]){
sumI+=(gyu[i]+numbers[i]);
}else{
sumG+=(gyu[i]+numbers[i]);
}
}
if(sumG>sumI) answer++; //규영이가 이는경우 answer 증가시킴.
if(sumG==sumI) draw++;
return;
}
for(int k=0;k<9;k++){
if(isSelected[k]) continue;
numbers[cnt]=in[k];
isSelected[k]=true;
permut(cnt+1);
isSelected[k]=false;
}
}
}