본문 바로가기

코딩테스트

[JAVA-D3] SWEA 6808 - 규영이와 인영이의 카드게임

728x90
 

SW Expert Academy

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

swexpertacademy.com

 

✅ 문제 요약

규영이는 고정적인 순서로 카드를 내고 인영이는 9! 경우의 수 순서대로 카드를 낼 때

두 사람의 최종적인 카드 점수 합을 비교하여 규영이가 이기는 경우의 수와 지는 경우의 수를 출력하라

 

🤔 문제 접근

규영이가  갖게될 카드가 입력으로 주어지기 때문에 크기 19인 (1부터 18까지를 위함) boolean 배열을 만들어

9가지 수를 입력 받을 때 boolean배열[해당수] = true 를 해주며 규영이의 카드 배열 gnum에 저장하고

이후 false인 수들이 인영이의 카드 이므로 크기 9의 inum 배열에 넣어두었다.

 

재귀 호출을 통해 icards 배열에 인영이가 낼 카드의 순서를 만들어 두고 이후 규영이의 카드와

순차적으로 비교하여 점수를 계산해주어 규영이의 승, 패 개수를 증가시켜주었다.

 

인영이가 낼 카드의 순서를 미리 만들어두는 것이 핵심이 되었던 문제였다.

🚨CODE

import java.io.*;
import java.util.*;

class Solution {
	static boolean[] nums;
	static int[] gnum;
	static int[] inum;
	static int[] icards;
	static boolean[] visit;
	static int win, lose;
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int T = Integer.parseInt(br.readLine());

		for (int test_case = 1; test_case <= T; test_case++) {
			nums = new boolean[19];
			gnum = new int[9]; // 규영
			inum = new int[9]; // 인영
			visit = new boolean[9]; 
			
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int i = 0; i<9; i++) {
				int num = Integer.parseInt(st.nextToken());
				gnum[i] = num;
				nums[num] = true;
			}
			int idx = 0;
			for(int i = 1; i<19; i++) {
				if(!nums[i])
					inum[idx++] = i;
			}
			
			icards = new int[9];
			win = 0; lose = 0;
			checkSeq(0);
			
			bw.write(String.format("#%d %d %d\n", test_case, win, lose));
		
		} // end of testcase
		bw.flush();
	}
	public static void checkSeq(int count){
		if(count == icards.length) {
			cal();
			return;
		}
		
		for(int i = 0; i<icards.length; i++) {
			if(visit[i])
				continue;
			visit[i] = true;
			icards[count] = inum[i];
			checkSeq(count+1);
			visit[i] = false;
		}
	}
	
	public static void cal() {
		int gpoint = 0;
		int ipoint = 0;
		for(int i = 0; i<9; i++) {
			if(gnum[i] > icards[i]) {
				gpoint += gnum[i] + icards[i];
			}else {
				ipoint += gnum[i] + icards[i];
			}
		}
		
		if(gpoint > ipoint)
			win++;
		else
			lose++;
	}
}

 

 

728x90
반응형