문제
두 종류의 부등호 기호 ‘<’와 ‘>’가 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
#코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
n = int(input())
myInput = list(map(str, input().split()))
result = ['' for _ in range(15)]
checkMax = [False for _ in range(10)]
printMax = False
checkMin = [False for _ in range(10)]
printMin = False
def getMax(idx):
global printMax
if printMax == True: return
if idx>n:
for i in range(n+1):
print(result[i], end='')
print()
printMax = True
else:
for i in range(9, -1, -1):
result[idx] = i
if checkMax[i] == False:
# result[idx-1] result[idx]
# myInput[idx-1]
flag = False
if idx == 0:
flag = True
elif myInput[idx-1] == '>':
if result[idx-1] > result[idx]: flag = True
else: # '<'
if result[idx-1] < result[idx]: flag = True
if flag == True:
checkMax[i] = True
getMax(idx+1)
checkMax[i] = False
def getMin(idx):
global printMin
if printMin == True: return
if idx>n:
for i in range(n+1):
print(result[i], end='')
print()
printMin = True
else:
for i in range(0, 10):
result[idx] = i
if checkMin[i] == False:
# result[idx-1] result[idx]
# myInput[idx-1]
flag = False
if idx == 0:
flag = True
elif myInput[idx-1] == '>':
if result[idx-1] > result[idx]: flag = True
else: # '<'
if result[idx-1] < result[idx]: flag = True
if flag == True:
checkMin[i] = True
getMin(idx+1)
checkMin[i] = False
getMax(0)
getMin(0)
|
cs |
#복습
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
import sys
def getMax(x):
global n, check, getInfo, isMax
if isMax == True: return
# x값이 "부등호 갯수 + 1"과 같을 때까지 숫자를 9부터 부등호에 맞게 숫자를 나열한다.
if x > n: # 기저조건 x값이 n보다 커지면 종료.
for i in result:
if i != -1:
print(i, end='')
isMax = True
return
else:
for i in range(9, -1, -1): # max값이기 때문에 9부터 시작해서 0까지 내려간다.
if check[i] == True: continue
flag = False
if x == 0: # 처음에는 무조건 9를 대입해준다.
result[x] = i
flag = True
else:
# 8[x-1] 9[i] 7 ==> result
# < >
# [x-1] ==>getInfo
result[x] = i
if getInfo[x-1] == '<' and result[x-1] < result[x]:
flag = True
elif getInfo[x-1] == '>' and result[x-1] > result[x]:
flag = True
if flag == True:
check[i] = True
getMax(x+1)
check[i] = False
def getMin(x):
global n, check, getInfo, isMin
if isMin == True: return
# x값이 "부등호 갯수 + 1"과 같을 때까지 숫자를 0부터 부등호에 맞게 숫자를 나열한다.
if x > n: # 기저조건 x값이 n보다 커지면 종료.
for i in result:
if i != -1:
print(i, end='')
isMin = True
else:
for i in range(10):
if check[i] == True: continue
flag = False
if x == 0: # x가 0일 때는 무조건 대입해준다
result[x] = i
flag = True
else:
result[x] = i
if getInfo[x-1] == '<' and result[x-1] < result[x]:
flag = True
elif getInfo[x-1] == '>' and result[x-1] > result[x]:
flag = True
if flag == True:
check[i] = True
getMin(x+1)
check[i] = False
if __name__ == "__main__":
n = int(sys.stdin.readline())
getInfo = list(map(str, sys.stdin.readline().split()))
result = [-1 for _ in range(10)] # 규칙에 맞는 숫자들이 나열된다.
check = [False for _ in range(10)] # 중복을 체크한다.
isMax = False
isMin = False
# < > 부등호 갯수 + 1 = 숫자 갯수
getMax(0)
print()
getMin(0)
|
cs |
'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글
NN단표 (0) | 2021.05.21 |
---|---|
숫자 개수 세기 (0) | 2021.05.19 |
division(백트래킹) (0) | 2021.05.17 |
순열구하기(백트래킹) (0) | 2021.05.17 |
회전판과 로봇 (robot.cpp) (0) | 2021.05.16 |