코테/프로그래머스

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

내꺼블로그 2024. 3. 4. 12:18

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

코드


-C++

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

using namespace std;

vector<string> solution(vector<string> players, vector<string> callings) {
    //vector<string> answer;
    map<string, int> m;
    for(int i=0;i<players.size();i++){
        m.insert({players[i], i});
    }
    for(int i=0;i<callings.size();i++){
        string temp;
        int idx = m[callings[i]];
        temp=players[idx];
        players[idx]=players[idx-1];
        players[idx-1]=temp;
        m[callings[i]]--;
        m[players[idx]]++;
    }
    return players;
}

 

 

-C#

using System;
using System.Collections.Generic;

public class Solution {
    public string[] solution(string[] players, string[] callings) {
        string[] answer = new string[] {};
        Dictionary<string, int> dicOrder = new Dictionary<string, int>();
        for(int i=0;i<players.Length;i++){
            dicOrder.Add(players[i], i);
        }
        for(int i=0;i<callings.Length;i++){
            int idx = dicOrder[callings[i]];
            string temp = players[idx];
            players[idx]=players[idx-1];
            players[idx-1]=temp;
            dicOrder[players[idx]]++;
            dicOrder[players[idx-1]]--;
        }
        return players;
    }
}

 

 

풀이


처음 플레이어 순서를 map(C#에서 딕셔너리마냥 쓰는 애, 구조가 같지는X)에 저장(이름->키, 순서->값)

callings를 순회하면서 players와 map(C++) or Dictionary(C#)를 갱신.

 

 

 

 

다른 풀이


using System;
using System.Collections.Generic;

public class Solution {
    public string[] solution(string[] players, string[] callings) {
        int n = players.Length;
        string[] answer = new string[n];
        Dictionary<string, int> dicOrder = new Dictionary<string, int>();
        Dictionary<int, string> dicOrder2 = new Dictionary<int, string>();
        for(int i=0;i<players.Length;i++){
            dicOrder.Add(players[i], i);
            dicOrder2.Add(i, players[i]);
        }
        for(int i=0;i<callings.Length;i++){
            int idx = dicOrder[callings[i]];
            dicOrder2[idx]=dicOrder2[idx-1];
            dicOrder2[idx-1]=callings[i];
            dicOrder[callings[i]]--;
            dicOrder[dicOrder2[idx]]++;
        }
        for(int i=0;i<players.Length;i++){
            answer[i]+=dicOrder2[i];
        }
        return answer;
    }
}

 

 

 

풀이


딕셔너리를 순위가 키, 사람이 값 / 사람이 키, 순위가 값인 딕셔너리 두 개를 선언한다.

두 개의 딕셔너리를 callings를 순회하면서 갱신.

순위가 키인 딕셔너리는 값을 키가 1 작은 값과 서로 바꾸고, 사람이 키인 딕셔너리는 callings[i]의 값을 줄이고, 그 전 애의 값을 늘린다.

그 다음 for문으로 순회하면서 순위가 키인 딕셔너리의 키 값이 작은 순으로 answer에 값을 할당한다.