반응형
프로그래머스
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
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
프로그래머스 미로 탈출 [Lv. 2] (C++) (0) | 2024.12.26 |
---|---|
프로그래머스 행렬 테두리 회전하기 [Lv. 2] (C++) (0) | 2024.11.27 |
프로그래머스 디펜스 게임 [Lv.2] (C++) (1) | 2024.11.23 |
프로그래머스 테이블 해시 함수 [Lv. 2] (C++) (0) | 2024.11.22 |
프로그래머스 거리두기 확인하기 [Lv. 2] (C++) (0) | 2024.11.18 |