일부 거래가 있다고 가정합니다. 다음과 같은 경우 트랜잭션이 유효하지 않을 수 있습니다. -
-
금액이 $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, ]