본문 바로가기
Problem Solving/SWEA

SWEA- 6808 규영이와 인영이의 카드게임

by 채니_ 2021. 2. 15.

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

 

SW Expert Academy

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

swexpertacademy.com


인영이의 카드내는 순서를 중복을 허용하지 않는 순열로 구하였다.


주석에서의 인영=>규영 규영=>인영 으로 바꾸어 읽어야 한다. (문제를 잘못읽었다)


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Scanner;
/* 문제 잘못읽어서 규영이랑 인영이 서로바뀜. ***주석에서 인영,규영을 반대로 읽으면 된다.***
 * 입력: 규영이의 카드9개
 * 구할것: 규영이가 이기는경우 수 win, 지는경우 수 res-win(총경우의수 -규영이가이기는경우)
 * 규영이순서는 고정. 변하는값-> 인영이카드내는순서에 따라 승패가정해짐. 순서? 순열!중복x
 * 숫자 1~18
 * 이기는경우: 높은수적힌카드낸사람 두카드적힌수 합만큼점수얻. 총점같으면 무승부(카운트x) 
 */
public class 규영이와인영이의카드게임 {

	static int win,res;
	static int [] ins ;//인영이의 카드배열
	static int [] gus ;//규영이의 카드배열
	static boolean[] gu;//규영이 카드를 넣기위한 체크배열
	public static void main(String[] args) throws FileNotFoundException {
	System.setIn(new FileInputStream("input/규영이와인영이의카드게임.txt"));
	Scanner sc = new Scanner(System.in);
	int T = sc.nextInt();
	for (int tc = 1; tc <= T; tc++) {
		win =0;//이기는경우의수 초기화
		res=0;//지는경우의수 초기화
		ins = new int[9];
		gus = new int[9];
		gu = new boolean[18];
		for (int i = 0; i < 9; i++) {
			ins[i] = sc.nextInt();//인영이의 카드배열 저장
			gu[ins[i]-1] = true;//중복체크
		}
		//규영이 카드배열 저장
		//만약 체크배열의값이 false면 그 인덱스(0부터시작하므로 +1해줌)를 규영이배열에 넣음
		int cnt=0;//규영이배열인덱스를 0부터시작
		for (int i = 0; i < 18; i++) {
			if(!gu[i]) {//만약 골라지지않았다면
				gus[cnt++]= i+1;//그 수를 배열에 넣고 cnt증가(후치연산이라 연산이 끝난후 증가)
			}
		}
		//순열
		permutation(new int [9],new boolean[9],0);//규영이 카드를 담을 배열, 방문체크배열, 뽑은수
		System.out.printf("#%d %d %d\n", tc,  res-win,win);
	}
	}

	private static void permutation(int[] sel, boolean[] v, int k) {
		if(k==gus.length) {//규영이배열길이만큼 돌았으면
			//인영규영 승패 비교시작
			res++;//모든경우의수
			int scorein=0;//인영이의점수
			int scoregu=0;//규영이의점수
			for (int i = 0; i < 9; i++) {
				int a = ins[i];//인영이의카드
				int b = sel[i];//규영이의카드
				if(a>b) scorein += a+b;//인영이가 이길경우 두 카드의 합만큼 점수를 얻는다
				if(a<b) scoregu += a+b;//규영이가 이길경우 두 카드의 합만큼 점수를 얻는다
				//같을경우 아무것도하지않음.
			}//end for
			if(scorein<scoregu) win++;//규영이가 이길경우
			return;	
		}
		for (int i = 0; i < 9; i++) {
			if(!v[i]) {
				v[i]=true;
				sel[k]=gus[i];//규영이배열에서 뽑음
				permutation(sel, v, k+1);
				v[i]=false;	
			}
		}
		
	}

}

'Problem Solving > SWEA' 카테고리의 다른 글

[SWEA]- 8382 방향 전환  (0) 2021.03.15
SWEA-3234 준환이의 양팔저울  (0) 2021.02.21
SWEA-1220 Magnetic  (0) 2021.02.13
SWEA- 9229 한빈이와 Spot Mart  (0) 2021.02.08
SWEA- 1233 계산기 2  (0) 2021.02.07

댓글