코딩문제/프로그래머스

레벨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;
}