Algorithm/Baekjoon

[백준/실버2] [2529] 부등호 - python, Pypy 3

chea-young

부등호


문제내용

두 종류의 부등호 기호 ‘<’와 ‘>’가 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 이다. 

프로그래밍 순서 - 브루트포스 알고리즘

1. permutaions을 이용하여 k개의 경우의 수를 찾음

2. 찾은 경우의 수를 부등호 데이터와 확인

  2-1 만약 부등호를 만족하지 않는다면 False를 반환

  2-2 부등호를 만족하면 True를 반환한 후 리스트에 추가

3. 부등호를 만족하는 것들 중에서 최대와 최소만 출력


전체코딩

 

- 코드- 브루트포스 알고리즘으로 풀었을 경우

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
# 2529 부등호
from itertools import permutations
 
# 입력
= int(input())
data = input().split()
 
def findPossible(case, data):
    for i, ele in enumerate(data):
        firstNum = int(case[i])
        secondNum = int(case[i+1])
        if ele == '<' and not (firstNum < secondNum):
            return False
        elif ele == '>' and not (firstNum > secondNum):
            return False
    return True
    
# 모든 경우의 수 찾기
allCase = permutations([str(i) for i in range(10)], k+1)
answer = []
for ele in allCase:
    check = findPossible(ele,data)
    if check:
        answer.append(ele)
 
# 출력
print(''.join(max(answer)))
print(''.join(min(answer)))
 

 


나중에 이어서 백트래킹으로 푸는 방법도 올리겠습니다!