일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- C
- 그래프
- Python
- 해시
- 면접질문
- Java
- 2색칠하기
- 이분그래프판별
- 단지번호붙이기
- 코딩테스트
- 동적계획법
- 문제풀이
- 고득점Kit
- BFS
- OS
- 코딩테스트준비
- 쿠쉬쿠쉬
- LV.3
- hash
- 코테준비
- C++
- 프로그래머스
- BruteForceSearch
- 운영체제
- Lv.1
- 알고리즘
- 파이썬
- Algorithm
- Lv.2
- Today
- Total
쿠쿠의기록
8. inequal 본문
문제
두 종류의 부등호 기호 ‘<’와 ‘>’가 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 } 중에서 선택해야 하며 선택된 숫자는 모두 달라야 한다. 프로그램의 실행시간은 0.5초를 넘을 수 없다.
입력
첫 줄에 부등호 문자의 개수를 나타내는 정수 가 주어진다. 그 다음 줄에는 k 개의 부등호 기호가 하나의 공백을 두고 한 줄에 모두 제시된다. k 의 범위는 2 <= k <= 9이다.
출력
여러분은 제시된 부등호 관계를 만족하는 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.
예제 입력
2
< >
예제 출력
897
021
예제 입력
9
> < < < > > > < <
예제 출력
9567843012
1023765489
문제풀이
#include <stdio.h>
int n;
int result[15];
char myInput[15];
bool checkMax[10],checkMin[10];
bool printMax = false,printMin = false;
void getMax(int x){
if(printMax==true){
return;
}
if(x>n){ //x숫자, n부등호
for(int i=0;i<n+1;i++){
printf("%d",result[i]);
}
printf("\n");
printMax = true;
}else{
for(int i=9;i>=0;i--){
result[x] = i;
if(checkMax[i] == false){
bool flag = false;
if(x==0) flag = true;
else{
if(myInput[x-1] == '>'){
if(result[x-1] > result[x]){
flag = true;
}
}else{ // '<'
if(result[x-1] < result[x]){
flag = true;
}
}
}
if(flag == true){
checkMax[i] = true;
getMax(x+1);
checkMax[i] = false;
}
}
}
}
}
void getMin(int x){
if(printMin==true){
return;
}
if(x > n){ //x숫자, n부등호
for(int i=0;i<n+1;i++){
printf("%d",result[i]);
}
printf("\n");
printMin = true;
}else{
for(int i=0;i<=9;i++){
result[x] = i;
if(checkMin[i] == false){
bool flag = false;
if(x==0) flag = true;
else{
if(myInput[x-1] == '>'){
if(result[x-1] > result[x]){
flag = true;
}
}else{ // '<'
if(result[x-1] < result[x]){
flag = true;
}
}
}
if(flag == true){
checkMin[i] = true;
getMin(x+1);
checkMin[i] = false;
}
}
}
}
}
int main() {
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf(" %c",&myInput[i]);
}
getMax(0);
getMin(0);
return 0;
}
'알고리즘 > L7~8 재귀함수' 카테고리의 다른 글
8. dessert (0) | 2020.09.08 |
---|---|
8. division (0) | 2020.09.08 |
8. tobin (0) | 2020.09.08 |
8. 순열구하기 (0) | 2020.09.07 |
7. mountain (0) | 2020.08.24 |