카드의 랭크가 적혀있는 ranks 라는 숫자배열과 카드의 모양이 적혀있는 문자 배열 suits 가 주어진다고 한다
두 배열의 같은 인덱스의 값이 그 카드의 랭크와 모양이고 카드의 랭크와 모양의 조합에 따라 poker hand 의 타입이 다음과 같이 바뀐다고 한다
1. 4개의 카드 모양이 같으면 -> 'Flush'
2. 3개의 카드 랭크가 같으면 -> 'Three of a Kind'
3. 2개의 카드 랭크가 같으면 -> 'Pair'
4. 그 이외의 경우 -> 'High Card'
이러한 상황에서 가장 좋은 poker hand를 가지는 경우를 리턴하는 문제이다
Example은 다음과 같다
문제를 잘 살펴보면 가장 높은 단계인 'Flush' 부터 나의 poker hand가 해당되는지 체크를 하면 될 것 같다
poker hand 중 'Flush' 만이 suits 배열로 정해지는데
조건은 모든 카드가 같아야한다 (카드의 갯수는 5장으로 정해져있다)
즉 suits의 카드 종류가 2가지 이상이면 'Flush' 는 될 수 없다
이것을 먼저 체크해주기 위해 나는 set을 사용하여 suits 의 중복을 없앤 후
spread 문법으로 배열을 만들어 배열의 길이로 flush인지 판별하는 도우미 함수
isFlush를 만들어서 판별하였다
const isFlush = (arr) => {
const set = new Set(arr);
return [...set].length > 1 ? false : true
}
만약 flush 가 아니라면 이제 ranks 배열을 이용하여 그 다음 단계의 poker hand를 판별해야한다
일단 내가 짠 코드는 다음과 같다
const bestHand = function(ranks, suits) {
let count = 1;
let count2 = 1;
ranks.sort((a,b) => a- b);
const isFlush = (arr) => {
const set = new Set(arr);
return [...set].length > 1 ? false : true
}
if(isFlush(suits)) return 'Flush'
console.log(ranks)
for(let i = 0; i < ranks.length - 1; i++) {
if(ranks[i] === ranks[i+1]) {
count2++;
continue;
}else {
count = Math.max(count, count2);
count2 = 1;
}
}
count = Math.max(count, count2);
if(count >= 3) {
return "Three of a Kind";
}else if (count === 2) {
return "Pair";
}else {
return "High Card"
}
};
우선 ranks 배열을 오름차순으로 정리해주고 난 후 ranks 의 처음 부터 바로옆의 rank 값을 비교를 했다
count, count2 에 1을 할당해주고 rank를 탐색하면서
옆의 rank 값과 현재 rank 값이 같다면 count2 의 값을 1증가시켜주었고
다르다면 count 값과 count2 값중 큰 값을 count 값으로 할당해주고 count2값을 1로 초기화 해주었다
그리고 만약 ranks 배열이 [2,4,4,4,4] 라면 i = 3 일때 count2 값은 4인 상태로 for문이 끝나므로
반복문이 끝나면 count와 count2 중 최댓값을 poker hand를 판별하는 count 값으로 갱신해주었다
그후 count 값에 따라 리턴을 다르게 해주었다
submit을 해보니
정답이었다!