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

C++에서 카드를 오름차순으로 표시

<시간/>

카드 한 벌이 있다고 가정합니다. 모든 카드에는 하나의 고유 번호가 있습니다. 원하는 순서대로 데크를 주문할 수 있습니다. 따라서 처음에는 모든 카드가 한 데크에서 앞면이 보이지 않게(공개되지 않은) 시작됩니다. 이제 모든 카드가 공개될 때까지 다음 단계를 여러 번 수행합니다. -

  • 카드 한 벌이 있다고 가정합니다. 모든 카드에는 하나의 고유 번호가 있습니다. 원하는 순서대로 데크를 주문할 수 있습니다. 따라서 처음에는 모든 카드가 한 데크에서 앞면이 보이지 않게(공개되지 않은) 시작됩니다. 이제 모든 카드가 공개될 때까지 다음 단계를 여러 번 수행합니다. -

  • 덱에 아직 카드가 있으면 덱의 다음 맨 위 카드를 덱 맨 아래에 놓습니다.

  • 아직 확인되지 않은 카드가 있으면 1단계로 돌아가세요. 그렇지 않으면 프로세스를 중지하세요.

따라서 카드를 오름차순으로 표시하는 데크의 순서를 반환해야 합니다.

이제 답변의 첫 번째 항목이 덱의 맨 위에 있는 것으로 간주됩니다.

따라서 입력이 [17,13,11,2,3,5,7]과 같으면 출력은 [2,13,3,11,5,17,7]이 됩니다. [2,13,3,11,5,17,7], 이제 2가 맨 위에 있고 2를 본 후 13을 마지막으로 이동하므로 데크는 [3,11,5,17,7,13 ], 그런 다음 3을 제거하고 단계를 다시 수행하십시오. 따라서 데크는 [5,17,7,13,11]이 되고, 그 후에 5를 제거하고, 위에서 아래로 이동한 후 배열은 [7,13,11,17]이 되고 동일한 작업을 수행하면 데크가 구조는 [11,17,13], [13.17], [17]이 되고 17을 삭제합니다.

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

  • 먼저 데크를 정렬할 때 n :=데크의 크기를 설정합니다.

  • 큐 q와 크기가 n인 배열을 정의

  • 연속적인 i 요소를 q에 삽입합니다. 여기서 i는 0에서 n – 1까지입니다.

  • 0 ~ n – 1 범위의 i에 대해

    • x :=q의 앞 요소, 대기열에서 삭제

    • ans[x] :=데크[i]

    • x :=q의 앞 요소 및 대기열에서 삭제

    • q에 x 삽입

  • 반환

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> deckRevealedIncreasing(vector& deck) {
      sort(deck.begin(), deck.end());
      int n = deck.size();
      queue <int> q;
      vector <int> ans(n);
      for(int i = 0; i < n; i++)q.push(i);
      int x;
      for(int i = 0; i < n; i++){
         x = q.front();
         q.pop();
         ans[x] = deck[i];
         x = q.front();
         q.pop();
         q.push(x);
      }
      return ans;
   }
};
main(){
   vector<int> v1 = {17,13,11,2,3,5,7};
   Solution ob;
   print_vector(ob.deckRevealedIncreasing(v1));
}

입력

[17,13,11,2,3,5,7]

출력

[2,13,3,11,5,17,7]