부등호
문제내용 두 종류의 부등호 기호 ‘<’와 ‘>’가 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
# 입력
k = 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)))
|
나중에 이어서 백트래킹으로 푸는 방법도 올리겠습니다!
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준/골드2] [1202] 보석도둑 - python, Pypy 3 (0) | 2022.06.06 |
---|---|
[백준/골드5] [2294] 동전2 - python, Pypy 3 (0) | 2022.06.03 |
[백준/골드4] [20040] 사이클 게임 - python, Pypy 3 (0) | 2022.05.21 |
[백준/실버4] [10816] 숫자카드2 - python, Pypy 3 (0) | 2022.05.21 |