Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 스트레이트의 손

<시간/>

Rima가 정수 배열로 주어진 카드 한 장을 가지고 있다고 가정합니다. 이제 그녀는 카드를 그룹으로 섞어 각 그룹이 W 크기가 되도록 하고 W 연속된 카드로 구성하려고 합니다. 가능한지 여부를 확인해야 합니다.

따라서 카드가 [1,2,3,6,2,3,4,7,8]이고 W =3이면 [1,2,3]과 같이 재정렬할 수 있으므로 답은 참이 됩니다. ,[2,3,4],[6,7,8]

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 지도 m을 정의하고 각 요소의 빈도를 m에 저장합니다.
  • 손의 크기가 0이 아닌 동안
    • 이전 :=0
    • it :=m의 첫 번째 키-값 쌍에 대한 포인터
    • 0 ~ W – 1 범위의 i에 대해
      • 값이 0인 동안 :=다음 쌍을 가리킴
      • 만약 i> 0이고 그것의 키 – 1 =prev 또는 i =0이면
        • 값을 1 감소
        • prev :=키
      • 그렇지 않으면 false를 반환
      • it :=다음 쌍을 가리킴
    • n :=n – W
  • 참을 반환합니다.

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool isNStraightHand(vector<int>& hand, int W) {
      map <int, int> m;
      int n = hand.size();
      if(n % W != 0) return false;
      for(int i = 0; i < n; i++){
         m[hand[i]]++;
      }
      while(n){
         map <int, int> :: iterator it = m.begin();
         int prev = 0;
         for(int i = 0; i < W; i++){
            while(it->second == 0) it++;
            if((i > 0 && it->first - 1 == prev) || i == 0){
               it->second--;
               prev = it->first;
            }else{
               return false;
            }
            it++;
         }
         n -= W;
      }
      return true;
   }
};
main(){
   vector<int> v = {1,2,3,6,2,3,4,7,8};
   Solution ob;
   cout << (ob.isNStraightHand(v, 3));
}

입력

[1,2,3,6,2,3,4,7,8]
3

출력

1