문제
https://www.acmicpc.net/problem/25184
25184번: 동가수열 구하기
수열 $[2, 4, 1, 3]$은 $1$ 이상 $4$ 이하인 정수로 이루어져 있고, 모든 원소가 서로 다르다. 또한, 이웃한 원소의 차가 모두 $\lfloor \frac{4}{2} \rfloor$ $=$ $2$ 이상이다. 따라서 수열 $[2, 4, 1, 3]$은 동가
www.acmicpc.net
분석
입력 요구 사항:
1. N - 1<=N<=5,000, 원소의 개수
출력 요구 사항:
1. 길이가 N인 임의의 동가수열
풀이
먼저 동가수열에 대해 알아보자.
동가수열은 1 이상 N 이하인 정수로 이루어져 있고, 모든 원소는 서로 다르다.
동가수열의 서로 이웃한 원소의 차는 floor(N/2) 이상이다.
길이가 N인 동가수열을 만드는 경우의 수는 N!이다.
모든 경우의 수에다가 동가수열인지 검사까지 하면 대략 O(N!*N)이라는 경이로운 시간복잡도가 나올 것이다.
그렇다면 동가수열을 어떻게 구할 수 있을까?
일단 홀수인 경우와 짝수인 경우를 나눠서 생각해보자.
I) N = 2k(k는 자연수)
1,2,3,4,... k와, k+1, k+2, k+3,.., 2k를
k, 2k, k-1, 2k-1,... 1, k+1와 같이 배치해 주자. 차이가 전부 k = N/2가 된다.
II) N = 2k-1(k는 자연수)
1,2,3,4,.., k와 k+1, k+2, k+3,... 2k-1을 k+1을 맨 뒤로 빼고 위처럼 배치해 주면
1, k+2, 2, k+3, 3, k+4,..., k, 2k+1, k+1 다음과 같이 배치할 수 있다. 차이는 k 또는 k+1인데 floor(N/2) 이상이므로 OK
잡담
수열과 규칙 찾기는 빠질 수 없는 조합인 것 같다.
#include<iostream>
#include<sstream>
#include<bitset>
#include<set>
#include<unordered_map>
#include<map>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<tuple>
#include<algorithm>
#include<string>
#include<numeric>
#include<functional>
#include<cmath>
#include<cctype>
#include<cstring>
#include<iomanip>
#include<chrono>
// ---------- 사용자 정의 상수 ----------
#define PI 3.141592653589793
#define THOUSAND 1E+3
#define MILLION 1E+6
#define BILLION 1E+9
#define INF 1E+8
#define MAX 1E+7
// ---------- 사용자 정의 자료형 ----------
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
typedef pair<char, char> Pcc;
typedef pair<char, int> Pci;
typedef pair<char, string> PcS;
typedef pair<int, bool> Pib;
typedef pair<int, int> Pii;
typedef pair<int, string> PiS;
typedef pair<double, double> Pdd;
typedef pair<LL, LL> PLL;
typedef pair<string, int> PSi;
typedef pair<string, LL> PSL;
typedef pair<string, string> PSS;
typedef vector<string> Words;
// ---------- 템플릿 자료형 ----------
template<typename T> struct Matrix2D {
vector<vector<T>> m2;
Matrix2D() {};
Matrix2D(const size_t R, const size_t C, const T INIT) {
m2 = vector<vector<T>>(R, vector<T>(C, INIT));
}
};
template<typename T> struct Matrix3D {
vector<vector<vector<T>>> m3;
Matrix3D() {};
Matrix3D(const size_t H, const size_t R, const size_t C, const T INIT) {
m3 = vector<vector<vector<T>>>(H, vector<vector<T>>(R, vector<T>(C, INIT)));
}
};
// ---------- 템플릿 함수 ----------
template<typename T> vector<T> InitVector(const size_t SIZE, const T INIT) {
return vector<T>(SIZE, INIT);
}
template<typename T> vector<vector<T>> Init2DVector(const size_t R, const size_t C, const T INIT) {
return vector<vector<T>>(R, InitVector(C, INIT));
}
template<typename T> vector<vector<vector<T>>> Init3DVector(const size_t H, const size_t R, const size_t C, const T INIT) {
return vector<vector<vector<T>>>(H, Init2DVector(R, C, INIT));
}
template<typename T1, typename T2> pair<T1, T2> LoadPair() {
pair<T1, T2> p;
cin >> p.first >> p.second;
return p;
};
template<typename T> vector<T> LoadVector(const size_t SIZE) {
vector<T> V(SIZE);
for (T& e : V) {
cin >> e;
}
return V;
}
template<typename T1, typename T2> vector<pair<T1, T2>> LoadVector(const size_t SIZE) {
vector<pair<T1, T2>> V(SIZE);
for (pair<T1, T2>& p : V) {
p = LoadPair<T1, T2>();
}
return V;
}
template<typename T> vector<vector<T>> Load2DVector(const size_t R, const size_t C) {
vector<vector<T>> V(R, vector<T>(C));
for (vector<T>& row : V) {
row = LoadVector<T>(C);
}
return V;
}
template<typename T1, typename T2> vector<vector<pair<T1, T2>>> Load2DVector(const size_t R, const size_t C) {
vector<vector<pair<T1, T2>>> V(R, vector<pair<T1, T2>>(C));
for (vector<pair<T1, T2>>& row : V) {
row = LoadVector<T1, T2>(C);
}
return V;
}
template<typename T1, typename T2> void PrintPair(const pair<T1, T2>& p, const string sepsPair) {
cout << p.first << sepsPair << p.second;
}
template<typename T> void PrintVector(const vector<T>& V, const string sepsC) {
for (const T& e : V) {
cout << e << sepsC;
}
}
template<typename T1, typename T2> void PrintVector(const vector<pair<T1, T2>>& V, const string sepsR, const string sepsPair) {
for (const pair<T1, T2>& p : V) {
PrintPair<T1, T2>(p, sepsPair);
cout << sepsR;
}
}
template<typename T> void Print2DVector(const vector<vector<T>>& V, const string sepsR, const string sepsC) {
for (const vector<T>& row : V) {
PrintVector(row, sepsC);
cout << sepsR;
}
}
template<typename T1, typename T2> void Print2DVector(const vector<vector<pair<T1, T2>>>& V, const string sepsR, const string sepsC, const string sepsPair) {
for (const vector<pair<T1, T2>>& row : V) {
PrintVector<T1, T2>(row, sepsC, sepsPair);
cout << sepsR;
}
}
template<typename T, typename Compare = less<T>> void SortAll(vector<T>& V, Compare cmp = Compare()) {
sort(V.begin(), V.end(), cmp);
}
template<typename T, typename Compare = less<T>> void SortAll2D(vector<vector<T>>& V, Compare cmp = Compare()) {
for (vector<T>& row : V) {
Sort(row, cmp);
}
}
template<typename T, typename Compare = less<T>> void StableSortAll(vector<T>& V, Compare cmp = Compare()) {
stable_sort(V.begin(), V.end(), cmp);
}
template<typename T, typename Compare = less<T>> void StableSortAll2D(vector<vector<T>>& V, Compare cmp = Compare()) {
for (vector<T>& row : V) {
StableSort(row, cmp);
}
}
template<typename T> size_t LowerBoundIndex(const vector<T>& V, const T target) {
const size_t index = lower_bound(V.begin(), V.end(), target) - V.begin();
return index;
}
template<typename T> size_t UpperBoundIndex(const vector<T>& V, const T target) {
const size_t index = upper_bound(V.begin(), V.end(), target) - V.begin();
return index;
}
// ---------- 사용자 정의 함수 및 연산자 ----------
vector<int> MakeSequnece(const int N);
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
vector<int> seq;
int N;
cin >> N;
seq = MakeSequnece(N);
PrintVector<int>(seq, " ");
return 0;
}
vector<int> MakeSequnece(const int N) {
vector<int> seq = InitVector<int>(N, 0);
int half = ceil((double)N / 2);
for (int val = half, index = 0; val <= N && index < N; val--, index += 2) {
seq[index] = val;
}
for (int val = N, index = 1; val > 0 && index < N; val--, index += 2) {
seq[index] = val;
}
return seq;
};
'프로그래밍 > 백준' 카테고리의 다른 글
30676. 이 별은 무슨 색일까 (0) | 2023.11.28 |
---|---|
17286. 유미 (0) | 2023.11.27 |
12850. 본대 산책2 (0) | 2023.11.25 |
28444. HI-ARC=? (0) | 2023.11.24 |
29731. 2033년 밈 투표 (0) | 2023.11.23 |