근우는 오늘 재미있는 카드 게임을 배우고 있다. 카드는 빨간색, 파란색, 노란색, 녹색의 네 가지 색이 있고, 색깔별로 1부터 9까지 숫자가 쓰여진 카드가 9장씩 있다. 카드는 모두 36(=4x9)장이다. 근우가 배운 카드 게임은 36장의 카드에서 5장을 뽑고, 아래와 같은 규칙으로 정수를 계산하는 것이다.
각 카드는 다음과 같이 나타낸다. 카드의 색깔은 영어 대문자 R, B, Y, G로 나타내는데, R은 빨간색, B는 파란색, Y는 노란색, G는 녹색을 뜻한다. 예를 들어서 Y8은 노란색 8을 나타내고, B5는 파란색 5를 나타낸다.
<점수를 정하는 규칙>
입력으로 카드 5장이 주어질 때, 카드 게임의 점수를 구하는 프로그램을 작성하시오. 두 가지 이상의 규칙을 적용할 수 있는 경우에는 가장 높은 점수가 카드 게임의 점수이다.
첫째 줄부터 다섯째 줄까지 한 줄에 카드 하나씩 입력된다. 카드의 색깔과 숫자 사이에는 빈 칸이 하나 있다.
한 줄에 카드의 점수를 출력한다.
B 3
B 7
R 1
B 2
Y 7
207
두 가지 이상의 규칙을 적용할 수 있는 경우에는 가장 높은 점수가 카드 게임의 점수이다.에서 1번 규칙에 해당한다면 2번 규칙에 해당한다고 해도 1번 규칙보다 점수가 클 수 없다. 그렇기 때문에 if/elseif/else 형태로 구현해주면 된다.const fs = require('fs');
let cards = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
let colorMap = new Map();
let numberMap = new Map();
for (let i = 0; i < 5; i++) {
cards[i] = cards[i].trim().split(' ');
if (colorMap.has(cards[i][0])) {
colorMap.set(cards[i][0], [...colorMap.get(cards[i][0]), Number(cards[i][1])]);
} else {
colorMap.set(cards[i][0], [Number(cards[i][1])]);
}
if (numberMap.has(Number(cards[i][1]))) {
numberMap.set(Number(cards[i][1]), [...numberMap.get(Number(cards[i][1])), cards[i][0]]);
} else {
numberMap.set(Number(cards[i][1]), [cards[i][0]]);
}
}
let number = Array.from(numberMap.keys());
number.sort((a, b) => a - b);
let isConsecutive = true;
for (let i = 1; i < number.length; i++) {
if (number[i] - number[i - 1] !== 1) {
isConsecutive = false;
break;
}
}
let sameNum = [0, 0];
for (let num of numberMap) {
if (sameNum[1] <= num[1].length && sameNum[0] < num[0]) {
sameNum = [num[0], num[1].length];
}
}
let score = 0;
if (colorMap.size === 1 && isConsecutive) {
score += 900 + number[number.length - 1];
} else if (colorMap.size === 4 && sameNum[1] === 4) {
score += sameNum[0] + 800;
} else if (sameNum[1] === 3 && numberMap.size === 2) {
let two = 0;
for (let num of numberMap) {
if (sameNum[0] !== num[0]) two = num[0];
}
score += 700 + 10 * sameNum[0] + two;
} else if (colorMap.size === 1) {
score += 600 + number[number.length - 1];
} else if (numberMap.size === 5 && isConsecutive) {
score += 500 + number[number.length - 1];
} else if (sameNum[1] === 3) {
score += 400 + sameNum[0];
} else if (sameNum[1] === 2 && numberMap.size === 3) {
let second = 0;
for (let num of numberMap) {
if (num[0] !== sameNum[0] && num[1].length === 2) second = num[0];
}
score += 300 + 10 * sameNum[0] + second;
} else if (sameNum[1] === 2) {
score += 200 + sameNum[0];
} else {
score += 100 + number[number.length - 1];
}
console.log(score);
규칙이 많아서 구현하기 귀찮기는 하지만, 점수가 위에서 순차적으로 검사만 하면 겹칠 일이 없어서 그래도 너무 복잡하지 않게 풀기는 했다. 계속 map이랑 배열을 추가하다보니 조금 더 알아보기 쉽게 풀이가 가능했을 것 같은데 그게 그거 같긴 하다..