HyeLog

๋ฐฑ์ค€_2529_๋ถ€๋“ฑํ˜ธ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_2529_๋ถ€๋“ฑํ˜ธ

shj718 2022. 5. 10. 07:26

๐Ÿ“๋ฌธ์ œ: https://www.acmicpc.net/problem/2529

 

2529๋ฒˆ: ๋ถ€๋“ฑํ˜ธ

๋‘ ์ข…๋ฅ˜์˜ ๋ถ€๋“ฑํ˜ธ ๊ธฐํ˜ธ ‘<’์™€ ‘>’๊ฐ€ k๊ฐœ ๋‚˜์—ด๋œ ์ˆœ์„œ์—ด A๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ถ€๋“ฑํ˜ธ ๊ธฐํ˜ธ ์•ž๋’ค์— ์„œ๋กœ ๋‹ค๋ฅธ ํ•œ ์ž๋ฆฟ์ˆ˜ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์„œ ๋ชจ๋“  ๋ถ€๋“ฑํ˜ธ ๊ด€๊ณ„๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ œ์‹œ

www.acmicpc.net

 

๐Ÿ“์•Œ๊ณ ๋ฆฌ์ฆ˜: ๋ธŒ๋ฃจํŠธํฌ์Šค - ์ˆœ์—ด (๋ฐฑํŠธ๋ž˜ํ‚น(์žฌ๊ท€)์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์Œ. → ์†๋„ ํ–ฅ์ƒ ๊ฐ€๋Šฅ)

 

๐Ÿ“์•„์ด๋””์–ด: ๋ถ€๋“ฑํ˜ธ์— ๋”ฐ๋ฅธ ์ˆซ์ž๋“ค์˜ ์ˆœ์„œ๋งŒ ์ •ํ•ด์ง€๋ฉด, ์‹ค์ œ๋กœ ๊ฐ ์ˆซ์ž๋“ค์ด ์–ด๋–ค ์ˆซ์ž์ธ์ง€๋Š” ์ƒ๊ด€ ์—†์ด, ๊ทธ ์ˆœ์„œ์— ๋งž๊ฒŒ ๊ณ ๋ฅด๋ฉด ๋ถ€๋“ฑํ˜ธ๋ฅผ ๋ฌด์กฐ๊ฑด ๋งŒ์กฑํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ตœ๋Œ€์ˆ˜์™€ ์ตœ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ, ๊ฐ๊ฐ 987··· / 123··· ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ถ€๋“ฑํ˜ธ์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•œ๋‹ค.

 

๐Ÿ“์‹œ๊ฐ„๋ณต์žก๋„: (k+1)! * O(k)

๐Ÿ‘‰์ด์œ : ๋ถ€๋“ฑํ˜ธ์— ๋”ฐ๋ฅธ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๋Š” ๋ฐ์— (k+1)! ์†Œ์š”, ์ˆœ์„œ์— ๋งž๊ฒŒ permutation ํ•จ์ˆ˜๋กœ ๋‹ค์Œ ์ˆœ์—ด์„ ๊ณ ๋ฅด๋Š” ๋ฐ์— O(n) ์†Œ์š”.

 

๐Ÿ“STL: next_permutation(v.begin(), v.end()) ๊ณผ prev_permutation(v.begin(), v.end())

๐Ÿ‘‰ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค. ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

https://velog.io/@polynomeer/%EC%88%9C%EC%97%B4Permutation

 

์ˆœ์—ด(Permutation)

์ˆœ์—ด์€ ์ž„์˜์˜ ์ˆ˜์—ด์„ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์„ž๋Š” ๊ฒƒ์ด๋‹ค. ์ˆœ์—ด์€ ๋ธŒ๋ฃจํŠธ ํฌ์Šค ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ํ•˜๋Š”๋ฐ ์ˆœ์„œ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์งˆ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 123๊ณผ 132๊ฐ€ ์„œ๋„ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€

velog.io

 

๐Ÿ“์ฝ”๋“œ:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N; // ๋ถ€๋“ฑํ˜ธ ๊ฐœ์ˆ˜
char sign[9];

bool checkSign(vector<int> &perm) {
	for (int i = 0; i < N; i++) {
		if (sign[i] == '<') {
			if (perm[i] > perm[i + 1]) return false;
		}
		if (sign[i] == '>') {
			if (perm[i] < perm[i + 1]) return false;
		}
	}
	return true;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> sign[i];
	}

	vector<int> small(N + 1);
	vector<int> big(N + 1);

	for (int i = 0; i <= N; i++) {
		small[i] = i;
		big[i] = 9 - i;
	}

	do {
		if (checkSign(small)) {
			break;
		}
	} while (next_permutation(small.begin(), small.end()));

	do {
		if (checkSign(big)) {
			break;
		}
	} while (prev_permutation(big.begin(), big.end()));

	for (int i = 0; i < N + 1; i++) {
		cout << big[i];
	}
	cout << '\n';
	for (int i = 0; i < N + 1; i++) {
		cout << small[i];
	}
	cout << '\n';

	return 0;
}