Algorithm

[Baekjoon]11507번 카드셋트 - Javascript

호밀이 2024. 1. 30. 23:05

https://www.acmicpc.net/problem/11507

 

11507번: 카드셋트

예제1 : 12 12 11 13은 잃어버린 P카드 :  12개, K : 12개, H : 11개, T : 13라는 뜻이다. 예제2 : 같은 카드(H02)가 존재하므로 GRESKA을 출력하였다.

www.acmicpc.net

문제

최근에 진솔이는 로봇 공학을 하기 시작했다. 그래서 포커 카드가 완전한 세트인지 확인하는 로봇을 만들기로 결심했다.

그는 프로그램을 작성하는 일을 분담했다. 그 프로그램은 카드의 모양(스페이드(♠), 하트(♡), 다이아몬드(♢), 클럽(♣))을 인식하는 것이다. 문제를 간단하게 하기 위해서 모든 카드는 하나의 모양과 하나의 숫자를 가진다고 가정한다.

여기서 그 모양은 실제 그림 대신 문자로 대체한다. P,K,H,T에 해당한다. 그리고 숫자는 1~13에 해당하는 정수이다. 로봇은 각각의 카드를 TXY의 형태로 '카드 이름'을 정하는데 T는 모양에 해당하고 XY는 숫자에 해당한다. 만약 만약 숫자가 1자리 숫자이면 X=0에 해당한다. ex) 01.

만약에 모양이 P이고 숫자가 9이면 P09이다.

완벽한 카드 한 세트는 52개로 이루어져 있다. (4 (모양)x 13(숫자))

로봇은 모든 카드의 '카드이름'을 읽고 문자열 S로 결합한다.

이제 진솔이가 프로그래밍 하는 것을 도와주자.  문자열을 읽어 얼마나 많은 카드를 잃어버렸는지 세면 된다.

만약에 2개의 같은 카드가 존재한다면 GRESKA이라고 출력하면 된다.

입력

오직 1줄만 문자열 S(1 ≤ |S| ≤ 1000)가 들어온다. 이것은 현재 가지고 있는 카드 이름에 해당한다.

출력

만약 똑같은 카드가 존재한다면 GRESKA을 출력한다.

그렇지 않으면 4개의 정수를 공백 문자로 구분하여 출력한다. 각각 P, K, H, T에 해당한다.

예제 입력 1 복사

P01K02H03H04

예제 출력 1 복사

12 12 11 13

예제 입력 2 복사

H02H10P11H02

예제 출력 2 복사

GRESKA

 

문제풀이(1) - 런타임 에러

P, K, H, T의 카드가 각 13개씩 존재하는데 입력에 중복되지 않은 각 카드의 종류별로 개수를 세어주면 될 것이다.
1. 3자리씩 끊어서 카드의 총 개수를 파악한다.
2. 카드의 총 개수 중 중복여부를 확인한다. (중복일 경우 'GRESKA' 출력)
3. 카드 종류별로 13-가지고 있는 카드수 를 계산한뒤 출력한다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim();

// 전체 카드 목록
const totalCardList = [];
// 중복된 카드 여부
let flag = false;

// 카드 등록
for (let i = 0; i < input.length; i += 3) {
  const card = input.slice(i, i + 3);

  if (!totalCardList.includes(card)) {
    totalCardList.push(card);
  } else {
    flag = true;
    break;
  }
}

if (flag) {
  console.log("GRESKA");
} else {
  const answer = { P: 13, K: 13, H: 13, T: 13 };
  for (let i = 0; i < totalCardList.length; i++) {
    answer[totalCardList[i][0]] -= 1;
  }
  console.log(Object.values(answer).join(" ").trim());
}

 

문제풀이(2)

문제풀이(1)도 문제는 풀렸지만 입력단계에서 런타임 에러가 발생하는 문제였다.
입력을 readline으로 변경하니 해결되었다.

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

// 전체 카드 목록
const totalCardList = [];
// 중복된 카드 여부
let flag = false;

rl.on("line", function (line) {
  const input = line.trim();

  // 카드 등록
  for (let i = 0; i < input.length; i += 3) {
    const card = input.slice(i, i + 3);

    if (!totalCardList.includes(card)) {
      totalCardList.push(card);
    } else {
      flag = true;
      break;
    }
  }

  if (flag) {
    console.log("GRESKA");
  } else {
    const answer = { P: 13, K: 13, H: 13, T: 13 };
    for (let i = 0; i < totalCardList.length; i++) {
      answer[totalCardList[i][0]] -= 1;
    }
    console.log(Object.values(answer).join(" ").trim());
  }

  rl.close();
}).on("close", function () {
  process.exit();
});