본문 바로가기

swea

6808번. 규영이와인영이의카드게임

728x90

규영이와 인영이는 1에서 18까지의 수가 적힌 18장의 카드로 게임을 하고 있다.

한 번의 게임에 둘은 카드를 잘 섞어 9장씩 카드를 나눈다. 그리고 아홉 라운드에 걸쳐 게임을 진행한다.

한 라운드에는 한 장씩 카드를 낸 다음 두 사람이 낸 카드에 적힌 수를 비교해서 점수를 계산한다.

높은 수가 적힌 카드를 낸 사람은 두 카드에 적힌 수의 합만큼 점수를 얻고,

낮은 수가 적힌 카드를 낸 사람은 아무런 점수도 얻을 수 없다.

이렇게 아홉 라운드를 끝내고 총점을 따졌을 때, 총점이 더 높은 사람이 이 게임의 승자가 된다.

두 사람의 총점이 같으면 무승부이다.

이번 게임에 규영이가 받은 9장의 카드에 적힌 수가 주어진다.

규영이가 내는 카드의 순서를 고정하면, 인영이가 어떻게 카드를 내는지에 따른 9!가지 순서에 따라

규영이의 승패가 정해질 것이다.

이 때, 규영이가 이기는 경우와 지는 경우가 총 몇 가지 인지 구하는 프로그램을 작성하라.


[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 아홉 개의 정수가 공백으로 구분되어 주어진다.

각 정수는 1이상 18이하이며, 같은 정수는 없다.

규영이는 정수가 주어지는 순서대로 카드를 낸다고 생각하면 된다.


[출력]

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 칸을 띄운 후,

인영이가 카드를 내는 9! 가지의 경우에 대해 규영이가 게임을 이기는 경우의 수와 게임을 지는 경우의 수를

공백 하나로 구분하여 출력한다.

입력

4
1 3 5 7 9 11 13 15 17
18 16 14 12 10 8 6 4 2
13 17 9 5 18 7 11 1 15
1 6 7 9 12 13 15 17 18
//테스트 케이스 개수
//1st TC, 9장의 카드에 대한 정보        
//2nd TC

 

출력

#1 112097 250783
#2 250783 112097
#3 336560 26320
#4 346656 16224
//첫 번째 테스트케이스 결과
//두 번째 테스트케이스 결과

 
package a0812;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Solution_규영이와인영이의카드게임_서울_12반_이서영 {

	static int[] gy ;
	static int[] iy ;
	static int[] chk;
	static int wincnt =0;
	static int losecnt =0;

	// 9개수 나열을 모두 다르게 해서 이긴횟수 진횟수 구하기 -> 순열을 이용한다.
	public static void findWinCount(ArrayList<Integer>a,int[] iychk){
		
		if(a.size()==9) {
			int gys =0;
			int iys = 0;
			for(int i=0; i<9; i++) {
				if(gy[i]>a.get(i)) {
					gys=gys+gy[i]+a.get(i);
				}
				else {
					iys=iys+gy[i]+a.get(i);
				}
			}
			if(gys>iys) {
				
				wincnt++;
			}
			else if(gys<iys) {
				losecnt++;
			}
			return;
		}
		
		for(int i=0; i<iy.length; i++) {
			
			if(iychk[i]==0) { //주의!!! a.contains(iy[i])하면 시간 오래걸림 
				iychk[i]=1;
				a.add(iy[i]);
				findWinCount(a,iychk);
				a.remove(a.size()-1);
				iychk[i]=0;
			}
			
			
		}
		
		
		
	}
	
	
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("res/6806_input.txt")));
		int T;
		T=Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		StringTokenizer st; 
		for(int tc = 1; tc <= T; tc++)
		{
			gy = new int[9];
			iy = new int [9];
			chk = new int[19];
			 st = new StringTokenizer(br.readLine());
			for(int i=0;i<9; i++) {
				gy[i] = Integer.parseInt(st.nextToken());
				chk[gy[i]]=1;
				
			}
			int idx =0;
			for(int i=1;i<=18; i++) {
				if(chk[i]==0 && idx<9) {
					iy[idx]=i;
					idx++;
				}
			}
			wincnt =0;
			losecnt=0;
			findWinCount(new ArrayList<Integer>(), new int[9]);
		
			sb.append("#").append(tc+" "+wincnt+" "+losecnt+"\n");
		}
		
	System.out.println(sb);
	}	
}

- 순열을 이용해서 푸는 문제

- a.contains() 를 쓰게되면 시간 소요가 많이 되므로 왠만하면 check배열을 쓰자. 

'swea' 카테고리의 다른 글

파핑파핑지뢰찾기  (0) 2021.10.02
3307. 최장증가부분수열 (LIS)  (0) 2021.09.16
계산기2-1223번(Java)  (0) 2021.08.22
4012.요리사  (0) 2021.08.22
정올- 1828.냉장고  (0) 2021.08.22