πŸ™‡β€β™€οΈ[Silver III] 이전 μˆœμ—΄ - 10973

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 2180 KB, μ‹œκ°„: 0 ms

λΆ„λ₯˜

μ‘°ν•©λ‘ , κ΅¬ν˜„, μˆ˜ν•™

제좜 일자

2024λ…„ 6μ›” 24일 19:09:09

문제 μ„€λͺ…

1λΆ€ν„° NκΉŒμ§€μ˜ 수둜 이루어진 μˆœμ—΄μ΄ μžˆλ‹€. μ΄λ•Œ, μ‚¬μ „μˆœμœΌλ‘œ λ°”λ‘œ 이전에 μ˜€λŠ” μˆœμ—΄μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

사전 순으둜 κ°€μž₯ μ•žμ„œλŠ” μˆœμ—΄μ€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 이루어진 μˆœμ—΄μ΄κ³ , κ°€μž₯ λ§ˆμ§€λ§‰μ— μ˜€λŠ” μˆœμ—΄μ€ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 이루어진 μˆœμ—΄μ΄λ‹€.

N = 3인 κ²½μš°μ— μ‚¬μ „μˆœμœΌλ‘œ μˆœμ—΄μ„ λ‚˜μ—΄ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • 1, 2, 3
  • 1, 3, 2
  • 2, 1, 3
  • 2, 3, 1
  • 3, 1, 2
  • 3, 2, 1

μž…λ ₯

첫째 쀄에 N(1 ≀ N ≀ 10,000)이 주어진닀. λ‘˜μ§Έ 쀄에 μˆœμ—΄μ΄ 주어진닀.

좜λ ₯

첫째 쀄에 μž…λ ₯으둜 주어진 μˆœμ—΄μ˜ 이전에 μ˜€λŠ” μˆœμ—΄μ„ 좜λ ₯ν•œλ‹€. λ§Œμ•½, μ‚¬μ „μˆœμœΌλ‘œ κ°€μž₯ μ²˜μŒμ— μ˜€λŠ” μˆœμ—΄μΈ κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

πŸš€ν’€μ΄

이전 μˆœμ—΄μ„ κ΅¬ν•˜κΈ° μœ„ν•œ 곡식이 μžˆμ—ˆλ‹€.

κ·Έκ±Έ κ·ΈλŒ€λ‘œ κ΅¬ν˜„ν•˜λ©΄ λœλ‹€.

이전 μˆœμ—΄μ„ κ΅¬ν•˜λŠ” 곡식은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. λ’€μ—μ„œλΆ€ν„° 첫 번째 κ°μ†Œν•˜λŠ” μš”μ†Œλ₯Ό 찾음
  2. perm[i-1]보닀 μž‘μ€ μš”μ†Œλ₯Ό λ’€μ—μ„œλΆ€ν„° 찾음
  3. i-1 μœ„μΉ˜μ˜ μš”μ†Œμ™€ j μœ„μΉ˜μ˜ μš”μ†Œλ₯Ό κ΅ν™˜
  4. i μœ„μΉ˜λΆ€ν„° λκΉŒμ§€μ˜ μš”μ†Œλ₯Ό μ—­μˆœμœΌλ‘œ λ°”κΏˆ

이걸 ν•¨μˆ˜λ‘œ ν‘œν˜„ν–ˆλ‹€.

// 이전 μˆœμ—΄μ„ μ°ΎλŠ” ν•¨μˆ˜
bool PrevPermutation(vector<int>& perm) 
{
    int n = perm.size();
    int i = n - 1;

    // Step 1: λ’€μ—μ„œλΆ€ν„° 첫 번째 κ°μ†Œν•˜λŠ” μš”μ†Œλ₯Ό 찾음
    while (i > 0 && perm[i - 1] <= perm[i]) 
    {
        i--;
    }

    if (i == 0) 
    {
        return false; // 이전 μˆœμ—΄μ΄ μ—†μŒ (κ°€μž₯ 첫 번째 μˆœμ—΄)
    }

    // Step 2: perm[i-1]보닀 μž‘μ€ μš”μ†Œλ₯Ό λ’€μ—μ„œλΆ€ν„° 찾음
    int j = n - 1;
    while (perm[j] >= perm[i - 1]) 
    {
        j--;
    }

    // Step 3: i-1 μœ„μΉ˜μ˜ μš”μ†Œμ™€ j μœ„μΉ˜μ˜ μš”μ†Œλ₯Ό κ΅ν™˜
    swap(perm[i - 1], perm[j]);

    // Step 4: i μœ„μΉ˜λΆ€ν„° λκΉŒμ§€μ˜ μš”μ†Œλ₯Ό μ—­μˆœμœΌλ‘œ λ°”κΏˆ
    reverse(perm.begin() + i, perm.end());

    return true;
}

image

πŸš€μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <climits>

using namespace std;

// 이전 μˆœμ—΄μ„ μ°ΎλŠ” ν•¨μˆ˜
bool PrevPermutation(vector<int>& perm) 
{
    int n = perm.size();
    int i = n - 1;

    // Step 1: λ’€μ—μ„œλΆ€ν„° 첫 번째 κ°μ†Œν•˜λŠ” μš”μ†Œλ₯Ό 찾음
    while (i > 0 && perm[i - 1] <= perm[i]) 
    {
        i--;
    }

    if (i == 0) 
    {
        return false; // 이전 μˆœμ—΄μ΄ μ—†μŒ (κ°€μž₯ 첫 번째 μˆœμ—΄)
    }

    // Step 2: perm[i-1]보닀 μž‘μ€ μš”μ†Œλ₯Ό λ’€μ—μ„œλΆ€ν„° 찾음
    int j = n - 1;
    while (perm[j] >= perm[i - 1]) 
    {
        j--;
    }

    // Step 3: i-1 μœ„μΉ˜μ˜ μš”μ†Œμ™€ j μœ„μΉ˜μ˜ μš”μ†Œλ₯Ό κ΅ν™˜
    swap(perm[i - 1], perm[j]);

    // Step 4: i μœ„μΉ˜λΆ€ν„° λκΉŒμ§€μ˜ μš”μ†Œλ₯Ό μ—­μˆœμœΌλ‘œ λ°”κΏˆ
    reverse(perm.begin() + i, perm.end());

    return true;
}

void solve()
{
    int N;
    cin >> N; // μˆœμ—΄μ˜ 크기 μž…λ ₯ λ°›κΈ°
    vector<int> perm(N);

    for (int i = 0; i < N; ++i) 
    {
        cin >> perm[i]; // μˆœμ—΄ μž…λ ₯ λ°›κΈ°
    }

    // 이전 μˆœμ—΄μ΄ μ‘΄μž¬ν•˜λ©΄ 좜λ ₯
    if (PrevPermutation(perm)) 
    {
        for (int i = 0; i < N; ++i) 
        {
            cout << perm[i] << " ";
        }
        cout << endl;
    }
    else 
    {
        cout << -1 << endl; // 이전 μˆœμ—΄μ΄ μ—†μœΌλ©΄ -1 좜λ ₯
    }

}

int main() 
{
	FILE* stream;
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen_s(&stream, "input.txt", "rt", stdin);

	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: