백준 알고리즘

[백준/Python] 2529_부등호

헝그리개발자 2021. 6. 22. 12:55

문제

https://www.acmicpc.net/problem/2529

 

2529번: 부등호

두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열  A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제

www.acmicpc.net

풀이

처음에는 itertools.permutations로 풀려고 했으나 한번에 모든 경우의 수를 배열에 담기 때문에 메모리 초과가 났습니다.

따라서 재귀를 이용해서 완전 탐색하여 풀었습니다.

매자릿수 마다 0 ~ 9까지 숫자를 순회하여 한 숫자씩 string 타입으로 붙여나갔기 때문에, 맨 처음 나온 수가 최소값이 되고 맨 마지막에 나온 수가 최대값이 됩니다.

check 배열로 숫자의 중복을 막았습니다.

코드

import sys


def is_possible(i, j, k):
    if k == '<':
        return i < j
    if k == '>':
        return i > j
    return True


def recursive(cnt, num):
    global min_num, max_num
    if cnt > n:
        if not len(min_num):
            min_num = num
        else:
            max_num = num
        return
    for i in range(10):
        if not check[i]:
            if cnt == 0 or is_possible(num[-1], str(i), brackets[cnt - 1]):
                check[i] = True
                recursive(cnt + 1, num + str(i))
                check[i] = False


n = int(sys.stdin.readline().rstrip())
brackets = sys.stdin.readline().rstrip().split()
check = [False] * 10
max_num, min_num = '', ''
recursive(0, '')
print(max_num)
print(min_num)