반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-19 04:57
관리 메뉴

ImJay

[SWEA/Java] 6808. 규영이와 인영이의 카드게임 본문

SW Expert Academy/D3

[SWEA/Java] 6808. 규영이와 인영이의 카드게임

ImJay 2024. 2. 4. 17:03
반응형

[SWEA/Java] 6808. 규영이와 인영이의 카드게임

 

SW Expert Academy

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

swexpertacademy.com


풀이

package edu.ssafy.im.SWEA.D3.No6808;

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

public class Solution {

    static int[] selected; // 인영이가 선택한 카드를 저장할 배열
    static boolean visited[]; // 인영이가 해당 숫자를 이미 선택했는지 확인하는 배열
    static int GYU[]; // 규영이가 받은 카드를 저장할 배열
    static boolean[] cards; // 각 숫자가 이미 선택되었는지 여부를 저장하는 배열
    static long ans; // 규영이가 이긴 경우의 수
    static long lose; // 규영이가 지는 경우의 수

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());
        for (int test_case = 1; test_case <= T; test_case++) {
            ans = 0;
            lose = 0;
            StringTokenizer st = new StringTokenizer(br.readLine());
            cards = new boolean[19]; // 숫자가 1부터 18까지이므로 크기를 19로 설정
            visited = new boolean[19]; // 숫자가 1부터 18까지이므로 크기를 19로 설정
            GYU = new int[9]; // 규영이가 받을 카드는 9장이므로 크기를 9로 설정
            selected = new int[9]; // 인영이가 선택할 카드는 9장이므로 크기를 9로 설정
            for (int i = 0; i < 9; i++) {
                int in = Integer.parseInt(st.nextToken());
                cards[in] = true; // 이미 선택된 카드 표시
                GYU[i] = in; // 규영이가 받은 카드 저장
            }
            recursive(0, 0); // 재귀 함수 호출
            sb.append("#").append(test_case).append(" ").append(ans).append(" ").append((lose)).append('\n');
        }
        System.out.println(sb);

    }

    private static void recursive(int idx, int k) {
        if (idx == selected.length) { // 모든 카드를 선택했을 경우
            int PointGYU = 0; // 규영이의 점수
            int PointINY = 0; // 인영이의 점수
            for (int i = 0; i < 9; i++) {
                if (selected[i] > GYU[i]) { // 인영이가 선택한 카드가 규영이가 받은 카드보다 큰 경우
                    PointINY += (selected[i] + GYU[i]); // 인영이 점수에 더함
                } else if (selected[i] < GYU[i]) { // 인영이가 선택한 카드가 규영이가 받은 카드보다 작은 경우
                    PointGYU += (selected[i] + GYU[i]); // 규영이 점수에 더함
                }
            }
            if (PointINY < PointGYU) // 인영이의 점수가 규영이의 점수보다 작은 경우
                ans++; // 규영이가 이긴 경우의 수 증가
            else if (PointINY > PointGYU) // 인영이의 점수가 규영이의 점수보다 큰 경우
                lose++; // 규영이가 지는 경우의 수 증가
            return;

        }
        for (int i = 1; i <= 18; i++) { // 가능한 모든 카드에 대해 반복
            if (cards[i]) // 이미 선택된 카드인 경우 건너뜀
                continue;
            if (!visited[i]) { // 해당 숫자가 이미 선택되지 않은 경우
                visited[i] = true; // 해당 숫자를 선택함으로 표시
                selected[idx] = i; // 선택한 카드를 저장
                recursive(idx + 1, k + 1); // 다음 카드를 선택하기 위해 재귀 호출
                visited[i] = false; // 해당 숫자를 선택하지 않음으로 표시
            }

        }

    }

}
반응형
Comments