코딩문제/프로그래머스
레벨1 : 달리기 경주(C++)
Drill_Labito
2023. 9. 14. 01:09
URL : https://school.programmers.co.kr/learn/courses/30/lessons/178871?language=cpp
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
가장 직관적이게 풀수 있는방법이 뭘까 하다가 map<int, string>, map<string, int> 버퍼 2개를 생성해놓는다.
1. 순위에 따른 이름찾기용
2. 이름에 따른 순위찾기용
위 2가지를 이용해서 추월하는 플레이어랑 그 앞에 선수의 Rank, Name을 각각 담아두는 임시변수를 선언하고 swap 하는과정을 거쳐줌으로 문제를 해결하였다.
다만 비효율적인 과정이 있었는지 테스트케이스에서 거의 2초가까이 나오는점이 있는걸보면 성능이 좋은 코드가 아닌건 확실한거 같다.
개선과정은 추후 진행할 수 있도록 해야겠다.
#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
vector<string> solution(vector<string> players, vector<string> callings) {
map<int, string> playerData;
map<string, int> playerData2;
// Init Player Data
for(int i=0; i<players.size(); ++i)
{
playerData[i] = players[i];
playerData2[players[i]] = i;
}
// Process Callings
for(int i=0; i<callings.size(); ++i)
{
int beforeRank = 0, afterRank = 0;
string beforePlayer = "", afterPlayer = "";
// CallingPlyaer
afterRank = playerData2[callings[i]];
afterPlayer = playerData[afterRank];
// Player ahead of CallingPlayer
beforeRank = playerData2[ playerData[afterRank - 1] ];
beforePlayer = playerData[beforeRank];
// Swapping PlayerData
playerData[beforeRank] = afterPlayer;
playerData2[beforePlayer] = afterRank;
playerData[afterRank] = beforePlayer;
playerData2[afterPlayer] = beforeRank;
}
vector<string> answer;
for(auto data : playerData)
{
answer.push_back(data.second);
}
return answer;
}