Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 포커 풀하우스 판별하기

포커의 풀하우스란?

포커에서 풀하우스(Full House)는 다섯 장의 카드 가운데 세 장이 서로 같은 숫자(랭크)를 이루는 상황을 의미합니다. 엄밀히 말하면 풀하우스는 '세 장이 같은 숫자(트리플)'와 '두 장이 같은 숫자(원페어)'가 동시에 존재하는 조합으로, 예를 들어 K-K-K-2-2가 대표적인 풀하우스입니다.

이번 글에서는 다섯 장의 카드를 담은 배열을 인자로 받아, 풀하우스가 성립하면 true, 그렇지 않으면 false를 반환하는 JavaScript 함수를 작성해 보겠습니다.

예제 코드

const arr1 = ['K', '2', 'K', 'K', 'J']; // K가 세 장 → 풀하우스 성립
const arr2 = ['K', '2', 'K', 'A', 'J']; // 같은 카드가 세 장 미만 → 풀하우스 아님

const isFullHouse = arr => {
  const copy = arr.slice();
  for(let i = 0; i < arr.length; ){
    const el = copy.splice(i, 1)[0];
    if(copy.includes(el)){
      copy.splice(copy.indexOf(el), 1);
      if(copy.includes(el)){
        return true;
      }
    } else {
      i++;
    }
  }
  return false;
};

console.log(isFullHouse(arr1));
console.log(isFullHouse(arr2));

이 코드의 동작 원리는 다음과 같습니다.

  • 먼저 slice()를 사용해 원본 배열을 보존한 채 복사본을 만듭니다.
  • 복사본에서 카드를 한 장씩 꺼낸 뒤(splice), 남은 배열에 같은 카드가 또 있는지 확인합니다.
  • 같은 카드가 하나 더 발견되면 이를 제거하고 한 번 더 검사하여, 결국 같은 카드가 세 장 이상 존재하면 즉시 true를 반환합니다.
  • 모든 카드를 검사했는데도 세 장짜리 조합을 찾지 못했다면 false를 반환합니다.

실행 결과

true
false

arr1에는 K가 세 장 포함되어 있어 true가 출력되고, arr2는 어떤 카드도 세 장 이상 등장하지 않아 false가 출력됩니다.

더 간결한 대안: 카드 개수 세기

배열을 복사하고 인덱스를 직접 조작하는 방식은 동작하지만 다소 복잡하고 실수하기 쉽습니다. 각 카드의 등장 횟수를 객체에 기록한 뒤 확인하면 훨씬 읽기 쉬운 코드를 작성할 수 있습니다.

const isFullHouse = arr => {
  const counts = {};
  for (const card of arr) {
    counts[card] = (counts[card] || 0) + 1;
  }
  return Object.values(counts).some(count => count >= 3);
};

console.log(isFullHouse(['K', '2', 'K', 'K', 'J'])); // true
console.log(isFullHouse(['K', '2', 'K', 'A', 'J'])); // false

참고: 실제 포커 규칙에 맞추려면

실제 포커 규칙에서 풀하우스는 반드시 '트리플 + 원페어' 조합이어야 하며, 같은 숫자 네 장(포 카드)은 풀하우스로 인정되지 않습니다. 이를 정확히 판별하려면 마지막 반환문을 다음과 같이 수정하면 됩니다.

const values = Object.values(counts);
return values.includes(3) && values.includes(2);

이렇게 하면 정확히 세 장과 두 장의 조합으로 이루어진 경우에만 true를 반환하게 되어, 실제 포커 규칙에 부합하는 판별이 가능합니다.