1722 순열의 순서
본문 바로가기
알고리즘 모음집/New 알고리즘

1722 순열의 순서

by KyeongMin 2021. 2. 20.
728x90
반응형

www.acmicpc.net/problem/1722

#include<stdio.h>
#include<iostream>
using namespace std;
#define N_SIZE 21// 최대 입력으로 주어지는 수 
int N;//입력으로 주어지는 수
long long int facArr[N_SIZE];//n! 미리저장
int chkNum[N_SIZE];//사용된 숫자 체크
int Q_num;//문제 번호 1 이면 k번째 수열 출력
			//   번호 2 이면 현재 수열의 위치 출력
void init() {//초기화 및 입력
	N = Q_num = 0;
	scanf("%d", &N);
	scanf("%d", &Q_num);
}
void fac() {//펙토리얼 미리 저장
	facArr[0] = 1;
	facArr[1] = 1;
	for (int i = 2; i <= N; i++) {
		facArr[i] = i;
		facArr[i]*=facArr[i-1];
	}
}
int main(void) {
	init();
	fac();//펙토리얼 미리 저장
	if (Q_num == 1) {//k번째 수열 출력
		long long int k;//현재 위치 수열
		scanf("%lld", &k);
		long long int cnt = 0;//N과 같아지면 반복문 탈출
		long long int use = 0, rem = k;//사용한것 , 남은 수 변수
		int facNum = N - 1;//펙토리얼 더하는 수
		while (1) {//반복
			if (cnt == N)break;
			for (int i = 1; i <= N; i++) {//1부터 N까지 반복
				if (chkNum[i] == 1)continue;
				use += facArr[facNum];//더해진 위치
				rem -= facArr[facNum];//남은 위치
				if (rem <= 0) {
					rem += facArr[facNum];
					use -= facArr[facNum];
					facNum--;
					chkNum[i] = 1;//현재 확정된 값 체크
					cnt++;
					cout << i << " ";//확정된 값 출력
					break;
				}
			}
		}
	}
	else if (Q_num == 2) {//입력으로 주어진 수열의 위치 출력
		int numArr[21];//입력 수열 저장
		for (int i = 0; i < N; i++) {
			scanf("%d", &numArr[i]);
		}
		int cnt = 0;//탈출 조건 N과 같으면 
		int facNum = N - 1;//펙토리얼 더하는 수
		long long int use = 0;//현재 위치의 수 저장
		for (int i = 0; i < N; i++) {//0번 인덱스부터 탐색
			chkNum[numArr[i]] = 1;
			for (int j = 1; j <numArr[i]; j++) {
				if (chkNum[j] == 1)continue;//사용한 숫자 건너 뛰기
				use += facArr[facNum];
			}
			facNum--;
		}
		cout << use + 1;
	}
	return 0;
}

1번 소스 구현 전 설계

2번 소스 구현 전 설계

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

1987 알파벳  (0) 2021.02.28
9095 1,2,3 더하기  (0) 2021.02.25
1018 체스판 다시 칠하기  (0) 2021.02.20
3085 사탕게임  (0) 2021.02.19
1107 리모컨  (0) 2021.02.18

댓글