💣 시간초과!
vector내에서 원하는 원소를 찾기위해 std::find()를 신나게 사용했다가 일부 테스트케이스에서 시간초과가 뜨는 문제가 생겼다...
인자로 들어오는 vector들의 크기가 매우 큰 경우에 뜨는 것 같았다.
탐색하는데에 시간을 줄이기 위해 unordered_map<>형 인덱스를 생성하여 데이터를 찾을 때 인덱스를 참고하는 식으로 해결했다.
문제
얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.
선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.
입출력 예시
풀이
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
vector<string> solution(vector<string> players, vector<string> callings) {
vector<string> answer = players;
unordered_map<string, int> players_index;
//. map에 저장
for (int i = 0; i < players.size(); ++i) {
players_index[players[i]] = i;
}
for (int i = 0; i < callings.size(); ++i) {
//. 추월한 선수의 현재 idx 찾기
auto it = players_index.find(callings[i]);
if (it != players_index.end()) {
int idx = it->second;
//. players_index 갱신!
players_index[answer[idx]] = idx - 1;
players_index[answer[idx - 1]] = idx;
//. 추월한 선수와 추월 당한 선수의 자리 바꾸기.
swap(answer[idx - 1], answer[idx]);
}
}
return answer;
}
'🐸 Problem Solving > Programmers' 카테고리의 다른 글
[Programmers/C++] 주사위 게임 1 (0) | 2024.07.23 |
---|---|
[Programmers/C++] 코드 처리하기 (0) | 2024.07.19 |
[Programmers/C++] 정수 제곱근 판별 (0) | 2024.07.18 |