문제
두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시된 부등호 순서열 A가 다음과 같다고 하자.
A ⇒ < < < > < < > < >
부등호 기호 앞뒤에 넣을 수 있는 숫자는 0부터 9까지의 정수이며 선택된 숫자는 모두 달라야 한다. 아래는 부등호 순서열 A를 만족시키는 한 예이다.
3 < 4 < 5 < 6 > 1 < 2 < 8 > 7 < 9 > 0
이 상황에서 부등호 기호를 제거한 뒤, 숫자를 모두 붙이면 하나의 수를 만들 수 있는데 이 수를 주어진 부등호 관계를 만족시키는 정수라고 한다. 그런데 주어진 부등호 관계를 만족하는 정수는 하나 이상 존재한다. 예를 들어 3456128790 뿐만 아니라 5689023174도 아래와 같이 부등호 관계 A를 만족시킨다.
5 < 6 < 8 < 9 > 0 < 2 < 3 > 1 < 7 > 4
여러분은 제시된 k개의 부등호 순서를 만족하는 (k+1)자리의 정수 중에서 최댓값과 최솟값을 찾아야 한다. 앞서 설명한 대로 각 부등호의 앞뒤에 들어가는 숫자는 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }중에서 선택해야 하며 선택된 숫자는 모두 달라야 한다.
입력
첫 줄에 부등호 문자의 개수를 나타내는 정수 k가 주어진다. 그 다음 줄에는 k개의 부등호 기호가 하나의 공백을 두고 한 줄에 모두 제시된다. k의 범위는 2 ≤ k ≤ 9 이다.
출력
여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.
예제 입력 1 복사
2
< >
예제 출력 1 복사
897
021
예제 입력 2 복사
9
> < < < > > > < <
예제 출력 2 복사
9567843012
1023765489
간단한 백트래킹 문제였다.
대신 0부터 모든 탐색을 돌리게 된다면 시간초과가 날수도 있지 않을까 하여 최대 최소를 구하는데 탐색방법을 줄일 수 있는 방법을 고민하였지만 단순히 완전탐색으로 돌렸는데도 시간초과 없이 AC를 받을 수 있었다. (다행이다)
모든 경우의 수를 구하고 만약에 n+1만큼 number의 length가 도달하면 < > 조건에 맞는지 for문을 돌려서 확인을 한다.
만약에 조건에 맞지 않다면 return을 해서 종료를 하고 살아남은 로직은 밑으로 내려와서 최초값을 min값으로 지정해 주고 마지막 값을 max값으로 지정해 준다. 왜냐하면 0부터 백트래킹을 하기 때문에 최초값은 곧 최솟값이고 마지막값은 곧 최댓값이다.
- c++
#include <bits/stdc++.h>
using namespace std;
int n;
vector<char>pos;
int visited[10];
string maxnum="";
string minnum="";
bool flag = false;
void dfs(int depth, string number){
if(number.length()==n+1){
for(int i = 0 ; i < pos.size(); i++){
if(pos[i]=='<'){
if(number[i]-'0' > number[i+1]-'0' ){
return;
}
}else{
if(number[i]-'0' < number[i+1]-'0' ){
return;
}
}
}
if(flag == false){
minnum = number;
maxnum = number;
flag= true;
}else{
maxnum = number;
}
// cout << number << " / " << maxnum << " / " << minnum << " / " << depth << "\n";
}
for(int i = 0; i <= 9 ; i++ ){
if(visited[i]==0){
visited[i]=1;
dfs(depth+1,number + to_string(i));
visited[i]=0;
}
}
}
int main(void){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 0 ; i < n; i++){
char c;
cin >> c;
pos.push_back(c);
}
dfs(0,"");
// cout << " - - - - - " << "\n";
cout << maxnum << "\n";
cout << minnum << "\n";
return 0;
}
'Algorythms' 카테고리의 다른 글
백준 1826번 연료 채우기 c++ 풀이 (0) | 2023.08.28 |
---|---|
백준 9576번 책 나눠주기 c++ 풀이 (0) | 2023.08.27 |
백준 14889번 스타트와 링크 c++ 풀이 (0) | 2023.08.26 |
백준 15711번 환상의 짝꿍 c++ 풀이 (2) | 2023.08.23 |
백준 2636번 c++ 풀이 (0) | 2023.08.22 |