반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [SW expert Academy] SWEA 6808번 규영이와 인영이의 카드게임 자바(Java)

1) 난이도 : D3

 

2) 문제번호 : 6808번

 

3) 문제 출처

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWgv9va6HnkDFAW0

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

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;				
			}
		}
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기