코딩테스트/SWEA

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

5월._. 2022. 2. 14.
728x90

1. 문제

 

SW Expert Academy

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

swexpertacademy.com

1~18까지의 카드를 하나씩 내며 게임을 한다.

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

이긴 사람이 두 카드의 합만큼 점수를 얻고, 진 사람은 아무 점수도 얻을 수 없다.

아홉라운드를 끝내고 총점을 따졌을 때, 총점이 더 높은 사람이 이기는 게임이다.

규영이가 낼 카드의 순서와 종류는 이미 정해져있을 때, 규영이가 이기는 경우와 지는 경우가 총 몇가지인지 구한다.


2. 풀이

메인함수

inputCards = 규영이 카드

isSelected = 1~18까지의 카드. 카드번호로 바로 접근하기 위해 19칸을 설정했다.

static int lose, win;
    static boolean[] isSelected;
    static int[] inputCards;

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(in.readLine());

        StringBuilder sb = new StringBuilder();

        for (int tc = 1; tc <= T; tc++) {
            sb.append("#").append(tc).append(" ");
            StringTokenizer st = new StringTokenizer(in.readLine());

            lose = 0; win = 0;
            inputCards = new int[9];
            isSelected = new boolean[19];

            for (int i = 0; i < 9; i++) {
                inputCards[i] = Integer.parseInt(st.nextToken());
                isSelected[inputCards[i]] = true;
            }

            pickCard(0, 0);

            sb.append(win).append(" ").append(lose).append("\n");
        }

        System.out.print(sb);
    }

 

카드를 뽑는 메서드

9장 뽑았다면 얻은 점수와 171(1+...+18)에서 점수를 뺀 값을 비교해서 승부를 판단한다.

 

1부터 18까지 반복하며 아직 뽑지 않은 수이고 규영이가 이겼다면, 점수에 두 카드의 값을 합산하여 재귀호출한다.

규영이가 졌다면 카운트만 하나 더한 뒤 재귀호출한다.

private static void pickCard(int cnt, int sumWin) {
    if (cnt == 9) {
        if (sumWin > 171 - sumWin) ++win;
        else if (sumWin < 171 - sumWin) ++lose;
        return;
    }

    for (int i = 1; i <= 18; i++) {
        if (isSelected[i]) continue;
        isSelected[i] = true;

        if (inputCards[cnt] > i) pickCard(cnt + 1, sumWin + i + inputCards[cnt]);
        else pickCard(cnt + 1, sumWin);

        isSelected[i] = false;

    }

}

3. 결과

'코딩테스트 > SWEA' 카테고리의 다른 글

[SWEA] 4012 요리사 - JAVA  (0) 2022.02.16
[SWEA] 5644 무선충전 - JAVA  (0) 2022.02.16
[SWEA] 1233 사칙연산 유효성 검사 - JAVA  (0) 2022.02.11
[SWEA] 1210 Ladder1 - JAVA  (0) 2022.02.09
[SWEA] 1224 계산기3 - JAVA  (0) 2022.02.09

댓글