문제
풀이
규영이의 카드와 순서가 정해지고 인영이가 내는 순서에 따라 승패가 갈린다.
즉, 순열을 통해 인영이의 카드 순서의 경우의 수를 모두 구하고 승패 여부를 확인하면 된다.
순열을 구하는 방법은 대표적으로 두가지가 있는데 swap을 이용하여 순서를 구하거나
boolean 배열을 이용해 check하는 방법이다.
풀이1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class SWEA_6808 {
static StringTokenizer st;
static int a[];
static int b[];
static int win, defeat;
static int totalCnt;
static int nums[];
static boolean isSelect[];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for(int tc = 1; tc <= t; tc++) {
a = new int[9];
b = new int[9];
nums = new int[9];
boolean[] cardCheck = new boolean[19];
isSelect = new boolean[9];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 9; i++) {
int inputNum = Integer.parseInt(st.nextToken());
a[i] = inputNum;
cardCheck[inputNum] = true;
}
win = 0;
defeat = 0;
int idx = 0;
for (int i = 1; i <= 18; i++) {
if(cardCheck[i]) continue;
b[idx] = i;
idx++;
}
permutation(0);
System.out.printf("#%d %d %d%n", tc, win, defeat);
}
}
public static void permutation(int cnt) {
if(cnt == 9) {
totalCnt++;
solution();
return;
}
for(int i = 0; i< 9; i++) {
if(isSelect[i]) continue;
nums[cnt] = b[i];
isSelect[i] = true;
permutation(cnt+1);
isSelect[i] = false;
}
}
public static void solution() {
int aCount = 0;
int bCount = 0;
for(int i = 0; i < 9; i++) {
if (a[i]> nums[i]) aCount += a[i]+nums[i];
else if (a[i] < nums[i]) bCount += a[i]+nums[i];
}
if(aCount > bCount) win++;
else if (aCount < bCount) defeat++;
}
}
풀이2 - swap
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class SWEA_6808_규영이 {
static int win = 0;
static int lose = 0;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int TC = Integer.parseInt(st.nextToken());
for (int t = 1; t <= TC; t++) {
// 카드를 배열에 삽입한다.
int[] cardK = new int[9]; // 규영이의 카드 셋
int[] cardI = new int[9]; // 인영이의 카드 셋
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 9; i++) {
cardK[i] = Integer.parseInt(st.nextToken());
}
int[] temp = new int[18];
for (int i = 0; i < 9; i++) {
temp[cardK[i] - 1]++;
}
int j = 0;
for (int i = 0; i < 18; i++) {
if (temp[i] == 0)
cardI[j++] = i + 1;
}
// 인영이의 카드 순열을 만들고 규영이의 카드 셋과 비교하여 승리 분석
permutation(cardI, cardK, 0, 9, 9);
System.out.printf("#%d %d %d\n", t, win, lose);
}
}
static void permutation(int[] std, int[] arr, int depth, int n, int r) {
if (depth == r) {
comp(std, arr);
return;
}
for (int i = depth; i < n; i++) {
swap(arr, depth, i);
permutation(std, arr, depth + 1, n, r);
swap(arr, depth, i);
}
}
static void print(int[] arr, int r) {
for (int i = 0; i < r; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
static void swap(int[] arr, int depth, int i) {
int temp = arr[depth];
arr[depth] = arr[i];
arr[i] = temp;
}
static void comp(int[] std, int[] in) {
int stdP = 0;
int inP = 0;
for (int i = 0; i < 9; i++) {
if (std[i] > in[i])
stdP += std[i] + in[i];
else if (std[i] < in[i]) {
inP += std[i] + in[i];
}
}
if (stdP > inP)
lose++;
if (inP > stdP)
win++;
}
}
'Problem Solving > CT-Java' 카테고리의 다른 글
[프로그래머스/문자열] 60065 튜플 - JAVA (0) | 2023.09.16 |
---|---|
[프로그래머스/문자열] 60057 문자열압축 - JAVA (0) | 2023.09.16 |
[SWEA/구현] 무선 충전 [모의 SW 역량테스트] - 자바 (0) | 2022.08.27 |
[백준/BFS] 16236: 아기상어 - 자바 (0) | 2022.08.27 |
[백준/구현] 14499: 주사위 굴리기 - 자바 (0) | 2022.08.27 |