[백준] 2529번: 부등호 / Python / 브루트 포스

이다혜·2021년 7월 26일
0

부등호

  • 문제
    두 종류의 부등호 기호 ‘<’와 ‘>’가 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인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.

풀이 방법

  • 재귀함수로 백트래킹을 구현해 부등호를 만족하는 수들을 찾자.
  • 최소, 최대의 정수를 찾기 위해 global 변수를 정의하고, 종료 조건에 처음 도달하는 경우에 min값에 할당해준다.
  • 선택된 숫자가 모두 달라야 하므로, 선택된 수들을 체크할 수 있도록 리스트를 만들어 체크 여부를 저장한다.
  • 부등호를 만족시키는지 여부를 확인하기 위한 possible 함수를 따로 구현했다.
k = int(input())
ops = list(input().split())
check = [False] * 10 #숫자 i를 선택했는지 아닌지 체크하기 위한 리스트

def possible(num1, num2, op):
    if op == '<':
        return num1 < num2
    else:
        return num1 > num2
    
mx, mn = "", ""
def solve(cnt, s):
    global mx, mn
    if cnt == k + 1:
        if mn == '': # mn에 값이 할당되지 않았다면 처음 도달했다는 뜻이므로 min
            mn = s
        else:
            mx = s
        return
    
    for i in range(10):
        if check[i] == False: # i가 선택하지 않은 숫자인 경우에
            if cnt == 0 or possible(s[-1], str(i), ops[cnt - 1]): # 해당 부등호를 만족시킨다면
                check[i] = True # 선택했다는 표시를 하고
                solve(cnt + 1, s + str(i)) # 다음 함수 호출
                check[i] = False # 호출 종료 시 선택 해제
                
solve(0, "")
print(mx)
print(mn)
profile
하루하루 성장중

0개의 댓글