[프로그래머스] - 달리기 경주

gcoco·2023년 4월 20일
0

안녕하세요! 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를 이용해 이름이 불릴때마다 각각 자리를 찾아주는것이었습니다!

또 새로운 문제로 뵙겠습니다 ^_^

profile
그코코 입니다.

0개의 댓글