https://school.programmers.co.kr/learn/courses/30/lessons/178871
벡터 players
에다가 대고
그냥 냅다 callings에 있는 애들 있으면 직전 원소랑 맞바꾸기.
사실 말도 안되는거라 안될거 알면서 한 번 해봤따.
고려해야 할 점.
players에는 겹치는 원소가 없고, 루프 돌면서 바뀌지 않는다.
callings는 players의 원소들로만 이루어져 있다.
callings의 원소들은 모두 players와 매칭될거라는거.
그러면 players의 각 원소들. 이름에 따라 순위만 바꿔주면 되는거 아닐까?
그래서. unordered_map
을 쓰자
근데 자꾸
string -> int
int -> string
둘 다 찾고 싶은거야..
고민고민하다가 찾아봤는데 map을 두 개 쓰면 된다는걸 알게됨..
그래서 하는데
int->string은 정렬되면 좋으니까
map으로 하고
string->int는 unordered_map으로 하자.
그래서 이렇게저렇게 뚝-딱 풀면 된다.
근데
umsi[call] -= 1;
umsi[p] += 1;
mis[idx] = p;
mis[idx-1] = call;
이런 코드도
swap(umsi[call], umsi[p]);
swap(mis[idx], mis[idx-1]);
이렇게..
최대한 stl을 사용하도록 하자!
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <map>
#include <iostream>
using namespace std;
vector<string> solution(vector<string> players, vector<string> callings) {
vector<string> answer;
unordered_map<string, int> umsi;
map<int, string> mis;
for (int i = 0 ; i < players.size() ; i++) {
umsi[players[i]] = i+1;
mis[i+1] = players[i];
}
for (auto& call : callings) {
int idx = umsi[call];
string p = mis[idx-1];
swap(umsi[call], umsi[p]);
swap(mis[idx], mis[idx-1]);
}
for (auto& um : mis) {
answer.emplace_back(um.second);
}
return answer;
}