본문 바로가기

프로그래밍/백준

25184. 동가수열 구하기


문제

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