SW Expert Academy/D3
[SWEA/Java] 6808. 규영이와 인영이의 카드게임
ImJay
2024. 2. 4. 17:03
반응형
[SWEA/Java] 6808. 규영이와 인영이의 카드게임
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이
package edu.ssafy.im.SWEA.D3.No6808;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Solution {
static int[] selected; // 인영이가 선택한 카드를 저장할 배열
static boolean visited[]; // 인영이가 해당 숫자를 이미 선택했는지 확인하는 배열
static int GYU[]; // 규영이가 받은 카드를 저장할 배열
static boolean[] cards; // 각 숫자가 이미 선택되었는지 여부를 저장하는 배열
static long ans; // 규영이가 이긴 경우의 수
static long lose; // 규영이가 지는 경우의 수
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int test_case = 1; test_case <= T; test_case++) {
ans = 0;
lose = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
cards = new boolean[19]; // 숫자가 1부터 18까지이므로 크기를 19로 설정
visited = new boolean[19]; // 숫자가 1부터 18까지이므로 크기를 19로 설정
GYU = new int[9]; // 규영이가 받을 카드는 9장이므로 크기를 9로 설정
selected = new int[9]; // 인영이가 선택할 카드는 9장이므로 크기를 9로 설정
for (int i = 0; i < 9; i++) {
int in = Integer.parseInt(st.nextToken());
cards[in] = true; // 이미 선택된 카드 표시
GYU[i] = in; // 규영이가 받은 카드 저장
}
recursive(0, 0); // 재귀 함수 호출
sb.append("#").append(test_case).append(" ").append(ans).append(" ").append((lose)).append('\n');
}
System.out.println(sb);
}
private static void recursive(int idx, int k) {
if (idx == selected.length) { // 모든 카드를 선택했을 경우
int PointGYU = 0; // 규영이의 점수
int PointINY = 0; // 인영이의 점수
for (int i = 0; i < 9; i++) {
if (selected[i] > GYU[i]) { // 인영이가 선택한 카드가 규영이가 받은 카드보다 큰 경우
PointINY += (selected[i] + GYU[i]); // 인영이 점수에 더함
} else if (selected[i] < GYU[i]) { // 인영이가 선택한 카드가 규영이가 받은 카드보다 작은 경우
PointGYU += (selected[i] + GYU[i]); // 규영이 점수에 더함
}
}
if (PointINY < PointGYU) // 인영이의 점수가 규영이의 점수보다 작은 경우
ans++; // 규영이가 이긴 경우의 수 증가
else if (PointINY > PointGYU) // 인영이의 점수가 규영이의 점수보다 큰 경우
lose++; // 규영이가 지는 경우의 수 증가
return;
}
for (int i = 1; i <= 18; i++) { // 가능한 모든 카드에 대해 반복
if (cards[i]) // 이미 선택된 카드인 경우 건너뜀
continue;
if (!visited[i]) { // 해당 숫자가 이미 선택되지 않은 경우
visited[i] = true; // 해당 숫자를 선택함으로 표시
selected[idx] = i; // 선택한 카드를 저장
recursive(idx + 1, k + 1); // 다음 카드를 선택하기 위해 재귀 호출
visited[i] = false; // 해당 숫자를 선택하지 않음으로 표시
}
}
}
}반응형