SSAFY/SWEA

[SWEA] 6808 : 규영이와 인영이의 카드게임

믕비 2023. 5. 12. 16:53
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AWgv9va6HnkDFAW0&categoryId=AWgv9va6HnkDFAW0&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=JAVA&select-1=3&pageSize=10&pageIndex=3 

 

SW Expert Academy

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

swexpertacademy.com

결국 검색해서 해결했다.

그냥 바로바로 비교하고 점수를 구하면서 하는 건 왜 안되는지 아직 이해가 안됨..

일단 카드를 선택하기만 하고 선택한 카드를 다른 배열에 저장 후 다 선택하면 그때 카드비교를 하며 진행한다.

 

내 코드

메모리 : 20340 KB

시간 : 2843 ms

코드길이 : 1537 B

 

[내 코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution {
	static int[] K, I;
	static boolean[] check;
	static int[] compare;
	static int win;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		
		int T = Integer.parseInt(br.readLine());
		for(int t = 1; t <= T; t++) {
			sb.append('#').append(t).append(' ');
			K = new int[9];
			I = new int[9];
			boolean[] card = new boolean[19];
			st = new StringTokenizer(br.readLine());
			//규영이의 카드
			for(int i = 0; i <9; i++) {
				K[i] = Integer.parseInt(st.nextToken());
				card[K[i]] = true;
			}
			//인영이의 카드
			int index = 0;
			for(int i = 1; i <= 18; i++) {
				if(!card[i])
					I[index++] = i;
			}
			
			compare = new int[9];
			check = new boolean[9];
			win = 0;
			game(0);
			//9!은 362880번이고 둘이 비기는 경우는 없기 때문에 9! - win이 진 횟수이다.
			sb.append(win).append(' ').append(362880 - win).append('\n');
		}
		System.out.print(sb);
	}
	static void game(int round) {
		//비교할 순서에 맞게 카드를 뽑아주었으면
		if(round == 9) {
			int Kscore = 0;
			int Iscore = 0;
			//규영이의 카드와 비교해줌(게임진행)
			for(int i = 0; i < 9; i++) {
				//규영이 카드값이 더 크면
				if(K[i] > compare[i])
					//규영이의 점수에 카드값의 합을 더해줌
					Kscore += K[i] + compare[i];
				else//인영이의 카드값이 더 크면
					//인영이의 점수에 카드값의 합을 더해줌
					Iscore += K[i] + compare[i];
			}
			//규영이가 이기면 규영이가 이긴수를 더해줌
			if(Kscore > Iscore)
				win++;
			return;
		}
		
		for(int i = 0; i < 9; i++) {
			//아직 뽑히지 않은 카드면
			if(!check[i]) {
				//비교할 규영이의 카드의 순서와 같은 곳에 인영이의 카드값을 넣어줌
				compare[round] = I[i];
				//뽑았으니 true로 변환시켜준 후
				check[i] = true;
				//다음에 뽑을 카드를 탐색하려 재귀호출
				game(round + 1);
				//다른 경우를 탐색하기 위해 false로 바꿔준 후 진행
				check[i] = false;
			}
		}
	}
}
반응형

'SSAFY > SWEA' 카테고리의 다른 글

[SWEA] 11285 : 다트게임  (0) 2023.05.12
[SWEA] 3131 : 100만 이하의 모든 소수  (0) 2023.05.12
[SWEA] 5948 : 새샘이의 7 - 3 - 5 게임  (0) 2023.05.12
[SWEA] 13428 : 숫자 조작  (0) 2023.05.12
[SWEA] 3282 : 0/1 Knapsack  (0) 2023.05.11