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

C++의 잘못된 트랜잭션

<시간/>

일부 거래가 있다고 가정합니다. 다음과 같은 경우 트랜잭션이 유효하지 않을 수 있습니다. -

  • 금액이 $1000를 초과하거나;

  • 다른 도시에서 동일한 이름의 다른 거래가 발생한 후 60분 이내에(포함하여) 발생한 경우

여기서 각 트랜잭션 문자열 transaction[i]은 트랜잭션의 이름, 시간(분), 금액 및 도시를 나타내는 쉼표로 구분된 값으로 구성됩니다. 거래 목록이 있으며 유효하지 않을 수 있는 거래 목록을 찾습니다. 따라서 입력이 ["alice,20,800,mtv", "bob,50,1200,mtv"]와 같으면 답은 ["bob,50,1200,mtv"]가 됩니다.

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

  • 세트 s를 정의합니다. 지도 정의

  • 범위 0에서 t – 1까지의 i에 대해

    • x :=t[i]

    • temp :=문자열 x를 사용하는 노드

    • 범위 0에서 m[온도 이름]의 크기까지 j의 경우

      • y :=m[온도 이름][j]

      • y의 도시가 임시 도시가 아닌 경우 |y의 시간 – 임시의 시간| −=60

        • 노드 y를 세트 s에 문자열로 삽입하고 x를 s에 삽입

    • temp> 1000이면 x를 s에 삽입

    • m[temp의 이름]에 temp 삽입

  • 세트의 항목을 반환합니다.

예시(C++)

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Node{
   public:
   string name;
   string city;
   int time;
   int amount;
};
class Solution {
   public:
   Node getNode(string s){
      string temp = "";
      Node ret;
      int cnt = 0;
      for(int i = 0; i < s.size(); i++){
         if(s[i] == ','){
            if(cnt == 0){
               ret.name = temp;
            }
            else if(cnt == 1){
               ret.time = stoi(temp);
            }
            else if(cnt == 2){
               ret.amount = stoi(temp);
            } else {
               ret.city = temp;
            }
            cnt++;
            temp = "";
            continue;
         }
         temp += s[i];
      }
      ret.city = temp;
      return ret;
   }
   vector<string> invalidTransactions(vector<string>& t) {
      set <string >s;
      map <string ,vector < Node >> m;
      for(int i = 0; i < t.size(); i++){
         string x = t[i];
         Node temp = getNode(x);
         for(int j = 0; j < m[temp.name].size(); j++){
            Node y = m[temp.name][j];
            if(y.city != temp.city && abs(y.time - temp.time) <= 60){
               s.insert(y.name + "," + to_string(y.time) + "," + to_string(y.amount) + "," + y.city);
               s.insert(x);
            }
         }
         if(temp.amount > 1000){
            s.insert(x);
         }
         m[temp.name].push_back(temp);
      }
      vector <string> ret(s.begin(), s.end());
      return ret;
   }
};
main(){
   vector<string> v1 = {"alice,20,800,mtv","bob,50,1200,mtv"};
   Solution ob;
   print_vector(ob.invalidTransactions(v1));
}

입력

["alice,20,800,mtv","bob,50,1200,mtv"]

출력

[bob,50,1200,mtv, ]