줄 서는 방법

LJM·2023년 4월 4일
0

programmers

목록 보기
14/92

https://school.programmers.co.kr/learn/courses/30/lessons/12936?language=cpp

자바 효율성이 통과가 안되서 한참 고민하다가

C++로 변환하니 바로 통과된다. 음 자바 너무 팍팍하게 해놓은거 아닌감

실패한 자바코드

import java.util.*;

class Solution {

    public int[] solution(int n, long k) {
        int[] answer = {};

        answer = new int[n];

        List<Integer> num = new ArrayList<>();
        for(int i = 1; i <= n; ++i) {
            num.add(i);
        }

        long[] total = new long[n+1];
        total[1] = 1L;
        for(int i = 2; i <= n; ++i)
        {
            total[i] = i * total[i-1];
        }

        double div = n;
        long nk = k;
        for(int i = 0; i < n; ++i)
        {

            int idx = (int)Math.ceil(nk*div/total[n-i])-1;
            answer[i] = num.get(idx);
            num.remove(idx);

            div--;
            if(n-i-1 == 0)
                break;
            nk %= total[n-i-1];

            if(nk < 1)
                nk = total[n-i-1];
        }

        return answer;
    }
}

성공한 C++ 코드

#include <string>
#include <vector>
#include <cmath>

using namespace std;

vector<int> solution(int n, long long k) {
    vector<int> answer;

	vector<int> num;
	for (int i = 1; i <= n; ++i) {
		num.push_back(i);
	}

	vector<long long> total(n + 1);
	total[1] = 1LL;
	for (int i = 2; i <= n; ++i) {
		total[i] = i * total[i - 1];
	}

	double div = n;
	long long nk = k;
	for (int i = 0; i < n; ++i) {
		int idx = (int)(ceil(nk * div / total[n - i]) - 1);
		answer.push_back(num[idx]);
		num.erase(num.begin() + idx);

		div--;
		if (n - i - 1 == 0)
			break;
		nk %= total[n - i - 1];

		if (nk < 1)
			nk = total[n - i - 1];
	}

	return answer;
}
profile
게임개발자 백엔드개발자

0개의 댓글