[구름 goorm] 딱지놀이 - JavaScript

문제 출처

Lv.1 딱지놀이 - JavaScript

문제 핵심
  1. 두 딱지의 별의 개수가 다르다면, 별이 많은 쪽의 딱지가 이긴다.
  2. 별의 개수가 같고 동그라미의 개수가 다르다면, 동그라미가 많은 쪽의 딱지가 이긴다.
  3. 별과 동그라미의 개수가 같고 네모의 개수가 다르다면, 네모가 많은 쪽의 딱지가 이긴다.
  4. 별, 동그라미, 네모의 개수가 모두 같고 세모의 개수가 다르다면, 세모가 많은 쪽의 딱지가 이긴다.
  5. 별, 동그라미, 네모, 세모의 개수가 모두 같다면, 무승부이다.
  • 별: 4, 동그라미: 3, 네모: 2, 세모: 1
제한 조건
  • 첫째 줄에 딱지놀이의 총 라운드 수 N이 주어진다.
  • 그 다음 2N개의 줄에는 각 라운드에서 주어지는 딱지의 정보가 주어진다.
  • 두 줄로 첫 번째 줄은 어린이 A, 두 번째 줄은 어린이 B의 딱지 상태가 주어진다.
  • 딱지 상태의 첫 번째 값은 a라고 하면, a딱지의 그림의 개수를 의미하고 뒤따라 나오는 a개의 정수는 그림의 종류를 의미한다.
예시

입력
5
1 4
4 3 3 2 1
5 2 4 3 2 1
4 4 3 3 1
4 3 2 1 1
4 2 3 2 1
4 4 3 2 1
3 4 3 2
5 4 4 2 3 1
5 4 2 4 1 3

출력
A
B
B
A
D

풀이
const readline = require("readline");

(async () => {
  let rl = readline.createInterface({ input: process.stdin });
  const input = [];
  for await (const line of rl) {
    input.push(line);
  }

  const N = Number(input[0]);

  // i는 N만큼 반복하고, j는 1부터 2씩 증가한다.
  for (let i = 1, j = 1; i <= N; i++, j += 2) {
    // A와 B의 딱지 상태를 구한다.
    // slice() 메서드를 통해 첫 번째 값인 딱지의 개수를 제외한 나머지를 구한다.
    const A = input[j].split(" ").slice(1).map(Number);
    const B = input[j + 1].split(" ").slice(1).map(Number);

    // 무승부 판별을 위해 flag를 true로 초기화한다.
    let flag = true;

    // 4부터 1까지 (별, 동그라미, 네모, 세모) 반복하며
    // filter() 메소드를 사용해 각 모양의 개수를 구한다.
    for (let k = 4; k >= 1; k--) {
      const aNum = A.filter((n) => n === k).length;
      const bNum = B.filter((n) => n === k).length;

      // A와 B의 각 모양의 개수를 비교한다.
      if (aNum !== bNum) {
        // A가 더 많다면 "A"를 출력하고, B가 더 많다면 "B"를 출력한다.
        console.log(aNum > bNum ? "A" : "B");

        // flag를 false로 바꾼다.
        flag = false;
        break;
      }
    }

    // flag가 true라면 무승부이므로 "D"를 출력한다.
    if (flag) console.log("D");
  }

  // 문제의 오류로 마지막에 공백이 포함된다.
  console.log("");
  process.exit();
})();
정리

구름에 다양한 문제들이 있어서 재밌게 풀고 있습니다. 문제를 풀고 풀이를 정리해서 올려두겠습니다!

피드백은 언제나 환영입니다. 😊

사용한 메서드

split() 메서드 - MDN
slice() 메서드 - MDN
map() 메서드 - MDN
filter() 메서드 - MDN