[LeetCode] Best Poker Hand

준규·2022년 8월 13일
0

카드의 랭크가 적혀있는 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을 해보니

정답이었다!

profile
안녕하세요 :)

0개의 댓글