본문 바로가기
코딩테스트 준비/프로그래머스

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

by 스테디코디스트 2023. 10. 17.
반응형

<문제 소개>


<소스 코드>

#include <string>
#include <vector>
#include <map>

using namespace std;

vector<string> solution(vector<string> players, vector<string> callings) 
{    
    map<string, int> playersRank;
    
    for(int i = 0; i < players.size(); i++)
    {
        playersRank[players[i]] = i;
    }    
    
    for(int i = 0; i < callings.size(); i++)
    {
        // 현재 플레이어 등수
        int curPlayerRank = playersRank[callings[i]];
        
        playersRank[players[curPlayerRank]]--; // 현재 플레이어 순위 상승
        playersRank[players[curPlayerRank - 1]]++; // 추월당한 플레이어 순위 하강
        
        // 순위 교체
        swap(players[curPlayerRank], players[curPlayerRank - 1]);
    }
    
    return players;
}

<풀이과정>

1. map을 이용해 플레이어의 이름과 등수를 매칭할 playersRank 변수를 선언한다.

2. players는 순위대로 나열된 선수들의 집합이므로 players의 원소를 반복하면서 playersRank에 키로 해당 원소를 입력하고, value로는 해당 순서인 i를 넣어준다.

3. 모든 입력이 끝나서 플레이어별 등수를 나타내는 playersRank가 완성되었다면 이를 이용해 플레이어의 이름으로 바로 등수에 접근할 수 있다.

4. 해설진들이 부른 순서인 calling을 반복하면서 playersRank를 이용해 현재 플레이어의 등수를 알아낸다.

5. 이후 해설진들에게 불린 선수는 순위가 상승하고, 그 앞에있던 추월당한 플레이어의 순위는 하락하기에 playersRank에서 해당 선수들의 순위를 고쳐준다.

6. 다음으로 players의 실제 선수들의 순위를 swap을 통해 현재 선수와 그 앞의 선수의 등수를 바꿔준다.

7. 위의 과정을 반복하면 players는 해설진들이 부른 순서에 따라 순위가 변동되고 최종적으로 경주가 끝났을 때의 순위를 담고 있게 되므로 players를 리턴해서 마무리해준다.


<코멘트>

처음에 이중 for문으로 너무 쉽게 풀려서 이건 무조건 시간초과다 했는데 역시나 시간초과가 나왔다ㅋㅋ

그래서 다시 map을 이용해서 for문을 1번만 사용하여 풀었다.


<제출결과>