백준 - 14696번(딱지놀이)

최지홍·2022년 2월 18일
0

백준

목록 보기
68/145

문제 출처: https://www.acmicpc.net/problem/14696


문제

  • 두 어린이 A, B가 딱지놀이를 한다. 딱지놀이 규칙은 다음과 같다. 두 어린이는 처음에 여러 장의 딱지를 가지고 있고, 매 라운드마다 각자 자신이 가진 딱지 중 하나를 낸다. 딱지에는 별(★), 동그라미(●), 네모(■), 세모(▲), 네 가지 모양 중 하나 이상의 모양이 표시되어 있다. 두 어린이가 낸 딱지 중 어느 쪽이 더 강력한 것인지는 다음 규칙을 따른다.

  • 만약 두 딱지의 별의 개수가 다르다면, 별이 많은 쪽의 딱지가 이긴다.

  • 별의 개수가 같고 동그라미의 개수가 다르다면, 동그라미가 많은 쪽의 딱지가 이긴다.

  • 별, 동그라미의 개수가 각각 같고 네모의 개수가 다르다면, 네모가 많은 쪽의 딱지가 이긴다.

  • 별, 동그라미, 네모의 개수가 각각 같고 세모의 개수가 다르다면, 세모가 많은 쪽의 딱지가 이긴다.

  • 별, 동그라미, 네모, 세모의 개수가 각각 모두 같다면 무승부이다.

  • 예를 들어, 두 어린이 A, B가 낸 딱지가 다음 그림과 같다고 하자.

  • 위 규칙을 따르면 A의 딱지는 별 하나를 가지고 있고 B의 딱지는 별이 없으므로 승자는 A이다. 위의 그림이 라운드 1의 상황이었고, 라운드 2, 3, 4, 5의 상황이 아래 표와 같을 때, 라운드 2, 3, 4의 승자는 각각 B, B, A이며, 라운드 5에서는 무승부가 되어 이를 D로 표현하였다.

  • 별, 동그라미, 네모, 세모를 각각 숫자 4, 3, 2, 1로 표현한다. 예를 들어, 라운드 1의 경우 어린이 A가 낸 딱지의 그림 ★는 4로 표현할 수 있고, 어린이 B가 낸 딱지의 그림 ●●■▲는 3 3 2 1 로 표현할 수 있다.

  • 라운드의 수 N과 두 어린이가 순서대로 내는 딱지의 정보가 주어졌을 때, 각 라운드별로 딱지놀이의 결과를 구하는 프로그램을 작성하시오.


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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int ROUND = Integer.parseInt(reader.readLine());

        for (int i = 0; i < ROUND; i++) {
            int[] cardA = new int[4]; // A의 카드 그림
            int[] cardB = new int[4]; // B의 카드 그림
            StringTokenizer tokenizer = new StringTokenizer(reader.readLine()); // 각 라운드별 A의 선택
            int numA = Integer.parseInt(tokenizer.nextToken());
            for (int j = 0; j < numA; j++) {
                cardA[Integer.parseInt(tokenizer.nextToken()) - 1]++;
            }

            tokenizer = new StringTokenizer(reader.readLine()); // 각 라운드별 B의 선택
            int numB = Integer.parseInt(tokenizer.nextToken());
            for (int j = 0; j < numB; j++) {
                cardB[Integer.parseInt(tokenizer.nextToken()) - 1]++;
            }

            boolean flag = false;

            for (int j = 3; j >= 0; j--) {
                if (cardA[j] - cardB[j] != 0) { // 별의 갯수가 다름
                    sb.append(cardA[j] > cardB[j] ? "A" : "B");
                    flag = true;
                    break;
                }
            }

            if (!flag) sb.append("D");

            sb.append("\n");
        }

        System.out.println(sb);
    }

}

  • 우선순위에 따라 각 모양의 갯수만 비교하면 되는 간단한 문제였다.
  • 들어오는 숫자를 인덱스로 하여 갯수를 유지하는 배열을 두고 이들의 값을 하나씩 비교하는 방식으로 구현하였다.
  • 같은 인덱스를 가지는 두 배열의 값이 서로 다를 경우, 수가 더 큰 사람이 이긴 것으로 처리하였다.
profile
백엔드 개발자가 되자!

0개의 댓글