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

수민이슈·2023년 5월 1일
0

[C++] 코딩테스트

목록 보기
29/116
post-thumbnail

🖊️ 문제

https://school.programmers.co.kr/learn/courses/30/lessons/178871

🖊️ 풀이

1차

벡터 players에다가 대고
그냥 냅다 callings에 있는 애들 있으면 직전 원소랑 맞바꾸기.
사실 말도 안되는거라 안될거 알면서 한 번 해봤따.

2차

고려해야 할 점.
players에는 겹치는 원소가 없고, 루프 돌면서 바뀌지 않는다.
callings는 players의 원소들로만 이루어져 있다.
callings의 원소들은 모두 players와 매칭될거라는거.
그러면 players의 각 원소들. 이름에 따라 순위만 바꿔주면 되는거 아닐까?

그래서. unordered_map을 쓰자

3차

근데 자꾸
string -> int
int -> string
둘 다 찾고 싶은거야..
고민고민하다가 찾아봤는데 map을 두 개 쓰면 된다는걸 알게됨..

그래서 하는데
int->string은 정렬되면 좋으니까
map으로 하고
string->int는 unordered_map으로 하자.

그래서 이렇게저렇게 뚝-딱 풀면 된다.

근데

        umsi[call] -= 1;    
        umsi[p] += 1;
        mis[idx] = p;
        mis[idx-1] = call;

이런 코드도

        swap(umsi[call], umsi[p]);
        swap(mis[idx], mis[idx-1]);

이렇게..
최대한 stl을 사용하도록 하자!

🖊️ 코드

#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <map>
#include <iostream>

using namespace std;

vector<string> solution(vector<string> players, vector<string> callings) {
    vector<string> answer;
    unordered_map<string, int> umsi;
    map<int, string> mis;
    
    for (int i = 0 ; i < players.size() ; i++) {
        umsi[players[i]] = i+1;
        mis[i+1] = players[i];
    }
    
    for (auto& call : callings) {
    	int idx = umsi[call];
        string p = mis[idx-1];

        swap(umsi[call], umsi[p]);
        swap(mis[idx], mis[idx-1]);
    }
    
    for (auto& um : mis) {
        answer.emplace_back(um.second);
    }

    
    return answer;
}

0개의 댓글