Baekjoon/Silver
C++ / 백준 / 2529 / 부등호
GitHubSeob
2023. 6. 11. 23:01
문제
https://www.acmicpc.net/problem/2529
2529번: 부등호
두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시
www.acmicpc.net
문제풀이
처음에는 작은 수부터 모든 경우의 수를 돌면서 판별을 했더니 답은 맞았지만, 100456KB / 136ms라는 결과가 나왔다..
그래서 다른 답들을 봤더니 큰 수가 나오자마자 중단하고,
작은 수부터 큰 수로 탐색하면서 중간 과정을 자르고 탐색을 하길래 참고하였다.
0부터 9까지의 수를 이용하여 해당 부등호에 맞게 배치하면 된다.
큰 숫자 먼저 찾을 것이기 때문에 9부터 0까지 순서대로 들어간 num 벡터를 만든다.
void biggest() {
do {
for (idx = 1; idx <= k; ++idx) {
char sign = input[idx - 1];
if (sign == '<') {
if (num[idx - 1] >= num[idx]) {
break;
}
}
else if (sign == '>') {
if (num[idx - 1] <= num[idx]) {
break;
}
}
}
if (idx == k + 1) {
for (idx = 0; idx <= k; ++idx) {
cout << num[idx];
}
cout << '\n';
return;
}
} while (prev_permutation(num.begin(), num.end()));
}
모든 숫자를 탐색하기 위해 prev_permutation함수를 이용한다.
내림차순으로 숫자를 탐색하면서 부등호가 맞는지 판별한다.
부등호를 input벡터로 받았고 하나씩 나누어 sign 변수에 저장한다.
해당 부등호가 맞지 않으면 바로 중단하여 다음 숫자를 판별한다.
만약 모든 부등호가 맞다면 (idx가 k+1이라면) 현재 숫자를 출력하고 함수를 종료한다.
가장 큰 수를 출력했으므로 이번엔 가장 작은 수를 출력해야 한다.
biggest함수와 마찬가지로 smallest함수도 똑같다.
다만 다른 점은 오름차순으로 정렬을 하고 prev가 아닌 next_permutation 함수를 사용해야 한다.
코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int k, idx;
vector<char>input;
vector<int>num(10, 0);
void biggest() {
do {
for (idx = 1; idx <= k; ++idx) {
char sign = input[idx - 1];
if (sign == '<') {
if (num[idx - 1] >= num[idx]) {
break;
}
}
else if (sign == '>') {
if (num[idx - 1] <= num[idx]) {
break;
}
}
}
if (idx == k + 1) {
for (idx = 0; idx <= k; ++idx) {
cout << num[idx];
}
cout << '\n';
return;
}
} while (prev_permutation(num.begin(), num.end()));
}
void smallest() {
sort(num.begin(), num.end());
do {
for (idx = 1; idx <= k; ++idx) {
char sign = input[idx - 1];
if (sign == '<') {
if (num[idx - 1] >= num[idx]) {
break;
}
}
else if (sign == '>') {
if (num[idx - 1] <= num[idx]) {
break;
}
}
}
if (idx == k + 1) {
for (idx = 0; idx <= k; ++idx) {
cout << num[idx];
}
return;
}
} while (next_permutation(num.begin(), num.end()));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> k;
input = vector<char>(k, ' ');
for (idx = 0; idx < k; ++idx)
cin >> input[idx];
for (idx = 0; idx < 10; ++idx)
num[9 - idx] = idx;
biggest();
smallest();
}