#문제링크
https://www.acmicpc.net/problem/2529
2529번: 부등호
두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시
www.acmicpc.net
#나의풀이
import sys
answer = []
visited = [0] * 10
N = 0
def check(num1, num2, op):
if op == '>':
if int(num1) > int(num2):
return True
if op == '<':
if int(num1) < int(num2):
return True
return False
def DFS(L, num):
if L == N:
answer.append(num)
return
for i in range(10):
if (not visited[i]):
if L == 0 or check(num[L-1], str(i), S[L-1]):
visited[i] = 1
DFS(L+1, num+str(i))
visited[i] = 0
if __name__=="__main__":
T = int(sys.stdin.readline())
S = list(sys.stdin.readline().split())
N = len(S) + 1
DFS(0, '')
print(answer[-1])
print(answer[0])
#해설
시간복잡도 계산해보면 전체 순열을 만들어서 되는지 판별후 답을 출력해도 돌아갈꺼 같긴 했다.
좀 더 시간을 개선하기 위해 백트래킹을 썼고 check함수는 두 숫자와 op를 보고 맞는 판별식인지 확인했고
DFS함수는 L이 N의 길이만큼 완성이 되면 결과배열에 넣어주고 반복문을 돌면서 조건에 맞다면 num을 완성시켜주었다.
조건문으로는 0~9까지 1번만 쓸수 있기 때문에 방문 배열로 체크해서 방문을 안했으면 조건식이 돌아가게 했고
0번째 자리면 무조건 들어가야 하기때문에 or을 사용해주었다.
'코딩테스트' 카테고리의 다른 글
[백준/파이썬] 2589 보물섬 (0) | 2023.01.05 |
---|---|
[백준/파이썬] 1080 행렬 (0) | 2023.01.05 |
[백준/파이썬] 2002 추월 (0) | 2023.01.03 |
[백준/파이썬] 1916 최소비용 (0) | 2022.12.21 |
[백준/파이썬] 9251 LCS (0) | 2022.12.21 |