GitHubSeob

C++ / 프로그래머스 / 달리기 경주 본문

Programmers/Level 1

C++ / 프로그래머스 / 달리기 경주

GitHubSeob 2023. 6. 20.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/178871

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제풀이

이름을 입력하면 등수를 알려주는 map인 name_num을 선언,

등수를 입력하면 이름을 알려주는 map인 num_name을 선언한다.

이름이 불린 선수들이 있는 callings 벡터를 탐색하면서 각각의 정보를 불러와

num, name, prev_name, prev_num에 값들을 저장한다.

그다음 서로 값들을 바꿔준다.

모든 탐색이 끝났으면 answer에 추가해 주고 return 한다.

 

코드

#include <string>
#include <vector>
#include <unordered_map>
using namespace std;

vector<string> solution(vector<string> players, vector<string> callings) {
    vector<string> answer;
    int idx(0), num(0), prev_num(0);
    string name(""), prev_name("");
    unordered_map<string, int>name_num;
    unordered_map<int, string>num_name;

    for (idx = 0; idx < players.size(); ++idx) {
        name_num.insert({ players[idx],idx + 1 });
        num_name.insert({ idx + 1,players[idx] });
    }

    for (idx = 0; idx < callings.size(); ++idx) {
        num = name_num[callings[idx]];
        name = num_name[num];
        prev_name = num_name[num - 1];
        prev_num = num - 1;

        name_num[prev_name]++;
        name_num[name]--;

        num_name[num] = prev_name;
        num_name[prev_num] = name;
    }

    for (idx = 1; idx <= players.size(); ++idx) {
        answer.push_back(num_name[idx]);
    }
    return answer;
}