문제 개요
포커 플레이어가 무작위로 뽑은 5장의 카드를 나타내는 배열을 입력받는 함수를 작성해야 합니다. 이때 배열은 정확히 5개의 요소로 구성됩니다.
5장의 카드 중 최소 한 쌍의 페어가 존재한다면, 함수는 가장 높은 페어를 이루는 카드를 반환해야 합니다(페어가 하나뿐이라면 당연히 그 카드를 반환합니다). 반대로 페어가 전혀 없다면 false를 반환합니다.
예를 들어, 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.
const arr = ['A', 'Q', '3', 'A', 'Q'];
이 경우 함수는 아래와 같은 값을 반환해야 합니다.
'A' (카드 게임에서 'A' > 'Q'이므로)
구현 코드
다음은 위 문제를 해결하는 자바스크립트 코드입니다.
const arr = ['A', 'Q', '3', 'A', 'Q'];
const greatestPair = arr => {
const legend = '23456789JQKA';
const pairs = [];
for(let i = 0; i < arr.length; i++){
if(i !== arr.lastIndexOf(arr[i])){
pairs.push(arr[i]);
};
};
if(!pairs.length){
return false;
};
pairs.sort((a, b) => legend.indexOf(b) - legend.indexOf(a));
return pairs[0];
};
console.log(greatestPair(arr));
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
A
코드 동작 원리
이 코드가 어떻게 동작하는지 단계별로 살펴보겠습니다.
1. 페어 탐색: 각 카드에 대해 lastIndexOf() 메서드를 사용해 같은 카드가 배열 내 다른 위치에도 존재하는지 확인합니다. 현재 인덱스와 마지막 등장 인덱스가 다르다면 해당 카드는 페어를 이루고 있는 것이므로 pairs 배열에 추가합니다.
2. 페어가 없는 경우 처리: 탐색 결과 pairs 배열이 비어 있다면 페어가 존재하지 않는 것이므로 false를 즉시 반환합니다.
3. 내림차순 정렬: 카드의 강함 순서를 나타내는 기준 문자열 '23456789JQKA'를 활용해 페어들을 내림차순으로 정렬합니다. 이렇게 하면 가장 높은 페어가 항상 배열의 첫 번째 위치에 오게 됩니다.
4. 결과 반환: 정렬된 배열의 첫 번째 요소, 즉 가장 높은 페어의 카드를 반환합니다.
이처럼 lastIndexOf()와 sort()만으로도 복잡한 로직 없이 간결하게 포커 페어 판별 기능을 구현할 수 있습니다.