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