안녕하세요! gcoco 입니다.
제 코드는 다음과 같습니다.
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
vector<string> solution(vector<string> players, vector<string> callings) {
unordered_map<string,int> um1;//gcoco 1등!
unordered_map<int,string> um2;//1등! gcoco!
int rank =1;
//순위 등록을 위한 for문
for(auto i : players){
um1[i]=rank;
um2[rank]=i;
rank++;
}
//플레이어의 수 만큼의 answer vector를 만들어보자
vector<string> answer(players.size());
//이름이 불린사람들을 순회해주면서~
for(auto i: callings){
//순위 증감 계산해주기
int now1 = um1[i]--;
um1[um2[now1-1]]++;
string now2 = um2[now1-1];
um2[now1-1] = um2[now1];
um2[now1] = now2;
}
//답으로 제출할 answer vector에 담아주기
for(auto a : um2){
answer[a.first-1] = a.second;
}
return answer;
}
순위 증감 계산해주기를 좀 더 자세하게 볼까요?
int now1 = um1[i]--; //callings로 불린 i가 지금 몇등인지 확인을 해주고, 앞순위로
um1[um2[now1-1]]++; //i앞에 있는 사람의 이름을 찾아 후순위로
//um2에서도 순위에 맞게 이름 바꿔주기!
string now2 = um2[now1-1];
um2[now1-1] = um2[now1];
um2[now1] = now2;
결국 이 문제를 풀기 위한 저의 핵심 부분은, map을 두개를 사용하여 이름과 순위를 저장하는 um1, 순위와 이름을 저장하는 um2를 이용해 이름이 불릴때마다 각각 자리를 찾아주는것이었습니다!
또 새로운 문제로 뵙겠습니다 ^_^