츄르사려고 코딩하는 코집사입니다.
1. [SW expert Academy] SWEA 6808번 규영이와 인영이의 카드게임 자바(Java)
1) 난이도 : D3
2) 문제번호 : 6808번
3) 문제 출처
swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWgv9va6HnkDFAW0
2. 문제
규영이와 인영이는 1에서 18까지의 수가 적힌 18장의 카드로 게임을 하고 있다.
한 번의 게임에 둘은 카드를 잘 섞어 9장씩 카드를 나눈다. 그리고 아홉 라운드에 걸쳐 게임을 진행한다.
한 라운드에는 한 장씩 카드를 낸 다음 두 사람이 낸 카드에 적힌 수를 비교해서 점수를 계산한다.
높은 수가 적힌 카드를 낸 사람은 두 카드에 적힌 수의 합만큼 점수를 얻고,
낮은 수가 적힌 카드를 낸 사람은 아무런 점수도 얻을 수 없다.
이렇게 아홉 라운드를 끝내고 총점을 따졌을 때, 총점이 더 높은 사람이 이 게임의 승자가 된다.
두 사람의 총점이 같으면 무승부이다.
이번 게임에 규영이가 받은 9장의 카드에 적힌 수가 주어진다.
규영이가 내는 카드의 순서를 고정하면, 인영이가 어떻게 카드를 내는지에 따른 9!가지 순서에 따라
규영이의 승패가 정해질 것이다.
이 때, 규영이가 이기는 경우와 지는 경우가 총 몇 가지 인지 구하는 프로그램을 작성하라.
3. 제약사항
-
4. 입력
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 아홉 개의 정수가 공백으로 구분되어 주어진다.
각 정수는 1이상 18이하이며, 같은 정수는 없다.
규영이는 정수가 주어지는 순서대로 카드를 낸다고 생각하면 된다.
5. 출력
각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 칸을 띄운 후,
인영이가 카드를 내는 9! 가지의 경우에 대해 규영이가 게임을 이기는 경우의 수와 게임을 지는 경우의 수를
공백 하나로 구분하여 출력한다.
6. 풀이
- 주영이가 낸 카드를 true로 바꿔 false인 경우를 인영이가 낸 카드 배열에 저장
- 인영이의 카드를 가지고 순열을 만들어서 서로의 카드를 계산해서 만약 주영이의 카드가 더 높다면 주영이의 스코어에 서로의 카드의 합을 넣고, 인영이의 카드가 더 높다면 인영이의 스코어에 서로의 카드의 합을 넣어 대소비교
- 주영이가 이겼으면 count 1 증가
- 362880은 9!
- 9!에서 count를 빼면 인영이가 이긴 횟수
7. 소스 코드
import java.util.*;
public class Solution {
static int[] A; //규영이가 낸 카드
static int[] B; //주영이가 낸 카드
static boolean[] check; //순열 체크
static int[] result; //결과 담는 배열
static int count; //이긴 횟수
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt(); //테스트케이스 개수
for(int tc=1;tc<=T;tc++) {
A = new int[9]; //규영이가 낸 카드
B = new int[9]; // 인영이가 낸 카드
//규영이가 낸 카드를 true로 저장해서 false는 인영이에게 넣기
boolean[] card = new boolean[19];
//규영이가 낸 카드를 true로 하고 저장
for(int i=0;i<9;i++) {
A[i] = sc.nextInt();
card[A[i]] = true;
}
int idx = 0;
//주영이가 낸 카드 저장
for(int i=1;i<=18;i++) {
if(!card[i]) {
B[idx++] = i;
}
}
result = new int[9];
check = new boolean[9];
count = 0;
perm(0);
System.out.printf("#%d %d %d\n",tc,count, 362880-count);
}
}
public static void perm(int index) {
if(index==9) {
int AScore = 0; //규영이 점수
int BScore = 0; //인영이 점수
//규영이 점수가 크면 규영이 점수에 합 추가
//인영이 점수가 크면 인영이 점수에 합 추가
for(int i=0;i<9;i++) {
if(A[i]>result[i]) AScore += A[i] + result[i];
else BScore += A[i] + result[i];
}
//규영이 점수가 크면 count 증가
if(AScore>BScore) count++;
return;
}
for(int i=0;i<9;i++) {
if(!check[i]) {
result[index] = B[i];
check[i] = true;
perm(index+1);
check[i] = false;
}
}
}
}
'알고리즘 > SW expert Academy' 카테고리의 다른 글
[SW expert Academy] SWEA 3307번 최장 증가 부분 수열 자바(Java) (0) | 2021.03.25 |
---|---|
[SW expert Academy] SWEA 3289번 서로소 집합 자바(Java) (0) | 2021.03.18 |
[SW expert Academy] SWEA 11315번 오목 판정 자바(Java) (0) | 2021.02.24 |
[SW expert Academy] SWEA 4047번 영준이의 카드 카운팅 자바(Java) (0) | 2021.02.24 |
[SW expert Academy] SWEA 1984번 중간 평균값 구하기 자바(Java) (0) | 2021.02.17 |
[SW expert Academy] SWEA 5215번 햄버거 다이어트 자바(Java) - 비트마스크 풀이 (0) | 2021.02.17 |
[SW expert Academy] SWEA 1493번 수의 새로운 연산 자바(Java) (0) | 2021.02.16 |
[SW expert Academy] SWEA 11457번 gravity 자바(Java) (0) | 2021.02.14 |
최근댓글