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