[백준] 2529: 부등호

rang-dev·2020년 5월 21일
0

코딩테스트 연습

목록 보기
9/13
post-custom-banner

문제

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

예제입력

2
< >

출력

여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.

예제출력

897
021

풀이

이번 문제는 정말 많이 헤맸던 문제이다. 손으로 풀어보면 어떻게 풀어야할지는 알겠는데 코딩을 어떻게 해야할지 막막했다. 적다가 꼬여서 지우고 적다 지우고를 반복했다. 결국에는 포기하고 내가 생각했던 논리로 해결한 풀이를 참조하여 답을 완성했다.

n = int(input())
signs = input().split()
signs.append('')
count_i = 0
count_d = 0
MAX = 9
MIN = 0
max_num = []
min_num = []

# 최대
for i in range(n+1):
    if len(max_num)==(n+1):
        break
    if signs[i]=='<':
        count_i += 1
    else:
        x_num = MAX - count_i - 1
        for j in range(100):
            max_num.append(MAX-count_i)
            if (count_i==0):
                MAX = x_num
                break
            count_i -= 1

# 최소
for i in range(n+1):
    if len(min_num)==(n+1):
        break
    if signs[i]=='>':
        count_d += 1
    else:
        n_num = MIN + count_d + 1
        for j in range(100):
            min_num.append(MIN+count_d)
            if count_d==0:
                MIN = n_num
                break
            count_d -= 1


## RESULTS
for i in range(n+1):
    print(max_num[i], end='')

print()

for i in range(n+1):
    print(min_num[i], end='')
  • 참조한 풀이에서는 for(int i=0;;i++)로 되어있는데 찾아보니 unlimited for문은 파이썬에서는 없는 것 같아서 range(n+1)으로 대체하였다.
  • signs[i]=='<'에서 IndexError: list index out of range가 계속 발생하는 문제가 있었다. 그 이유는 숫자가 부등호의 갯수보다 1개 많아야하기 때문에 signs가 끝나도 for문이 계속 돌아가야했다. 따라서 입력받은 signs리스트 끝에 공백을 추가해주었다.
profile
지금 있는 곳에서, 내가 가진 것으로, 할 수 있는 일을 하기 🐢
post-custom-banner

0개의 댓글