알고리즘 문제/프로그래머스

프로그래머스 줄 서는 방법 [Lv. 2] (C++)

우대비 2024. 11. 25. 00:03
반응형
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

사람의 수 n과, 자연수 k가 주어질 때, 사람을 나열 하는 방법을 사전 순으로 나열 했을 때, k번째 방법을 return하는 solution 함수를 완성해주세요.

 

풀이 방법

n명의 사람을 나열하는 경우의 수를 오름차순 했을 때, 1번부터 ~ k번까지 모두 찾는 방법은 속도에서 문제가 발생합니다

때문에 k번째의 사람을 한번에 찾는 방법을 사용합니다. 

 

4명의 사람이 있을 때, 1번이 가장 앞에 있는 경우는 3 * 2 * 1번 까지입니다. 

[1, 2, 3, 4]

[1, 2, 4, 3]

[1, 3, 2, 4]

[1, 3, 4, 2]

[1, 4, 2, 3]

[1, 4, 3, 2]

2번이 가장 앞에 있는 경우는 1번의 끝 + (3 * 2 * 1)까지가 됩니다.

 

즉, k가 6보다 작다면 가장 앞의 번호가 1일 것 이고

6보다 크다면 가장 앞의 번호는 k / (n-1)! +1가 될 것 입니다.

 

k를 기준으로 자리수별 들어갈 숫자를 위의 계산을 통해 찾아주면 됩니다.

정답 코드

#include <string>
#include <vector>
#include <iostream>

using namespace std;

long long GetFactorial(int N)
{
    long long ret = 1;
    for (int i = N; i > 1; i--)
        ret *= i;
    return ret;
}

int GetNum(int idx, vector<bool>& visited)
{
    for (int i = 1; i < visited.size(); i++)
    {
        if (visited[i] == false)
            idx--;
        
        if (idx == 0)
        {
            visited[i] = true;
            return i;
        }
    }
    return -1;
}
vector<int> solution(int n, long long k) {
    vector<int> answer;
    vector<bool> visited(n+1);
    vector<int> ret;
    
    k--;
    for (int i = n; i > 0; i--)
    {
        long long f = GetFactorial(i-1);
        int num = GetNum(k / f + 1, visited);
        answer.push_back(num);
        
        k %= f; 
    }
    
    return answer;
}

 

 

반응형
LIST