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

bbolddagu·2023년 4월 28일
0

C++

목록 보기
7/7

달리기 경주

문제

얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.

선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.

제한사항

  • 5 ≤ players의 길이 ≤ 50,000
    • players[i]는 i번째 선수의 이름을 의미합니다.
    • players의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • players에는 중복된 값이 들어가 있지 않습니다.
    • 3 ≤ players[i]의 길이 ≤ 10
  • 2 ≤ callings의 길이 ≤ 1,000,000
    • callings는 players의 원소들로만 이루어져 있습니다.
    • 경주 진행중 1등인 선수의 이름은 불리지 않습니다.

풀이

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

using namespace std;

vector<string> solution(vector<string> players, vector<string> callings) {
    vector<string> answer;
    
    // 등수별 이름
    map<int, string> rank;
    // 이름별 등수
    map<string, int> people;
    
    // 초기값 입력
    for(int i = 0; i < players.size(); i++){
        rank[i] = players[i];
        people[players[i]] = i;
    }
    
    // 등수 변경 시작
    for(int i = 0; i < callings.size(); i++){
        int now_rank_num = people[callings[i]]; // 현재 등수
        string changed_name = rank[now_rank_num - 1];   // 바로 위 등수 선수 이름
        // 등수 변경
        rank[now_rank_num - 1] = callings[i];   // 등수, 이름
        people[callings[i]] -= 1;    // 이름, 등수
        rank[now_rank_num] = changed_name;
        people[changed_name] += 1;
    }
    
    // 정답
    for(auto it = rank.begin(); it != rank.end(); it++){
        answer.push_back(it->second);
    }
     
    
    return answer;
}
  • <vector> 는 C++ 표준 라이브러리의 하나로, 동적 배열(dynamic array)을 구현한 컨테이너입니다. <vector>를 사용하면 크기가 동적으로 조절되는 배열을 쉽게 구현할 수 있습니다.
    따라서, 다음과 같은 상황에서 <vector>를 사용할 수 있습니다.
    • 크기가 동적으로 변하는 배열이 필요한 경우
    • 배열의 크기를 미리 예측할 수 없는 경우
    • 배열의 크기가 매우 큰 경우
    • 배열에 추가/삭제/탐색 작업이 빈번하게 일어나는 경우
  • <vector>는 STL(Standard Template Library)의 일부이며, 다양한 편리한 멤버 함수를 제공합니다. 예를 들어, push_back() 함수를 사용하면 배열의 끝에 원소를 추가할 수 있고, pop_back() 함수를 사용하면 배열의 끝에서 원소를 삭제할 수 있습니다. 또한, at() 함수를 사용하면 범위를 벗어나는 인덱스로의 접근을 방지할 수 있습니다.

0개의 댓글