본문 바로가기
Coding Test/Programmers

[Programmers] Lv 2. 줄 서는 방법

by song.ift 2023. 11. 16.

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//이 문제는 팩토리얼로 전체 경우의 수를 구하고,
//거기서 범위를 연산해서 순서를 구해야 함.
//
//문제의 예시로 설명하면
//n = 3, k = 5일 때,
//전체 경우의 수는 3!= > 6.
//
//이렇게 2마다(전체 경우의 수 / n) 숫자가 바뀜을 알 수 있다.
//2마다 숫자가 바뀌는데, k가 5면 나머지 1, 몫 2가 나온다.

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

void Update(int quotient, vector<int>& answer, vector<int>& nums)
{
    int temp = nums[quotient];

    answer.push_back(temp);
    nums.erase(nums.begin() + quotient);
}

vector<int> solution(int n, long long k) {
    vector<int> answer, nums;
    long long pivot, quotient, remainder;

    for (int i = 1; i <= n; ++i) nums.push_back(i);

    while (true)
    {
        pivot = Factorial(n) / n;

        remainder = k % pivot;
        quotient = k / pivot;
            
        if (remainder == 0)
        {
            // 나머지가 0이 나온 경우에는 해당 숫자의 마지막 순서.
            // 고로 현재 위치의 숫자를 제거하고, 남은 숫자들을 큰 순서대로 나열.
            // (1 4 3 2)   6

            // 나머지가 0이면 인덱스를 -1
            Update(--quotient, answer, nums);

            for_each(nums.rbegin(), nums.rend(), [&](const auto& e) {
                answer.push_back(e);
            });

            break;
        }
        else if (remainder == 1)
        {
            // 나머지는 1로 몫의 값 순서에서 첫 번째가 된다.
            // 남은 숫자들을 작은 순서대로 나열
            // (1 2 3 4)   1

            Update(quotient, answer, nums);

            for_each(nums.begin(), nums.end(), [&](const auto& e) {
                answer.push_back(e);
            });
            break;
        }

        // 나머지가 0이나 1이 아닌 경우에는 n과k를 갱신하고, 위의 과정을 반복.
        // (2 1 4 3)   8

        Update(quotient, answer, nums);

        --n;
        k = remainder;
    }

    return answer;
}

GitHub : https://github.com/developeSHG/Algorithm-Baekjoon_Programmers/commit/e02ea03be39a2b96032bb071c77149ac108c7d39

 

[level 2] Title: 줄 서는 방법, Time: 0.01 ms, Memory: 3.82 MB -BaekjoonHub · developeSHG/Algorithm-Baekjoon_Programmers@e0

developeSHG committed Nov 16, 2023

github.com

 

댓글