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