본문 바로가기
프로그래머스/Lv.2

[C++] 프로그래머스 줄 서는 방법

by MINU.SHINNNN 2024. 1. 16.

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

 

프로그래머스

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

programmers.co.kr

풀이

vector의 erase()함수를 사용해 남은 숫자를 편리하게 관리할 수 있습니다.

#include <string>
#include <vector>

using namespace std;

long long fac(int a){
    long long ans = 1;
    for(int i=1;i<=a;i++){
        ans*=i;
    }
    return ans;
}
vector<int> solution(int n, long long k) {
    vector<int> answer;
    vector<int> num;
    long long now=k;
    int cnt=1;
    for(int i=1;i<=20;i++){
        num.push_back(i);
    }
    
    while(cnt != n){
        long long tmp = fac(n-cnt);
        int idx = (now-1) / tmp;
        answer.push_back(num[idx]);
        num.erase(num.begin()+idx);
        cnt++;
        now %= tmp;
        // -1 해줘야 하므로 0일 경우 같은 수로 유지
		if (now == 0)
			now = tmp;
    }
    answer.push_back(num[0]);
    return answer;
    
}