[백준 문제] 2529번 부등호 (파이썬)


[백준 문제] 2529번 부등호 (파이썬)

내 풀이 문제점

  • 문제점 : 리스트에 순열을 다 넣어 버리면 그냥 시간초과가 나온다.
  • 다른 팀원들 풀이 방법 : DFS로 순열 구하는 방법 / 재귀로 푸는 방법
  • 다른 답안 : 다음 순열을 구하는 함수를 만드는 방법

내 코드와 다른 사람 코드 다른점

  • if와 else로 모호하게 쓰긴 보단 if와 if로 쓰는 것이 보기 좋아 보인다.
  • while True 같은 경우, 계속 돌아가는거니까 break절로 멈추는 식으로 짜보자.
  • if절에 함수르 돌리면 돌아가는구나
  • print(‘‘.join(map(str,big))) 프린트할때, 이거 애용하자.

내 풀이 (시간 초과)

import itertools
k = int(input())
ineq = list(map(str, input().split()))
all_lst = [str(i) for i in range(0,10)]
perm = list(itertools.permutations(all_lst, k+1))

for x in perm :
    x = list(x)
    is_possi = True
    for i in range(k) :
        if ineq[i] == '>' :
            if int(x[i]) > int(x[i+1]) :
                is_possi = is_possi & True
            else :
                is_possi = is_possi & False
        else :
            if int(x[i]) < int(x[i+1]) :
                is_possi = is_possi & True
            else :
                is_possi = is_possi & False
    if is_possi is True :
        ans1 = x
        break

for x in reversed(perm) :
    x = list(x)
    is_possi = True
    for i in range(k) :
        if ineq[i] == '>' :
            if int(x[i]) > int(x[i+1]) :
                is_possi = is_possi & True
            else :
                is_possi = is_possi & False
        else :
            if int(x[i]) < int(x[i+1]) :
                is_possi = is_possi & True
            else :
                is_possi = is_possi & False
    if is_possi is True :
        ans2 = x
        break


for i in range(k + 1):
    print(ans1[i], end='')
print()
for i in range(k + 1):
    print(ans2[i], end='')

다른 답안 풀이

def next_perm(a):
    i = len(a)-1
    while i > 0 and a[i-1] >= a[i]:
        i -= 1
    if i <= 0:
        return False
    j = len(a)-1
    while a[j] <= a[i-1]:
        j -= 1

    a[i-1],a[j] = a[j],a[i-1]

    j = len(a)-1
    while i < j:
        a[i],a[j] = a[j],a[i]
        i += 1
        j -= 1

    return True

def prev_perm(a):
    i = len(a)-1
    while i > 0 and a[i-1] <= a[i]:
        i -= 1
    if i <= 0:
        return False
    j = len(a)-1
    while a[j] >= a[i-1]:
        j -= 1

    a[i-1],a[j] = a[j],a[i-1]

    j = len(a)-1
    while i < j:
        a[i],a[j] = a[j],a[i]
        i += 1
        j -= 1

    return True

def check(perm, a):
    for i in range(len(a)):
        if a[i] == '<' and perm[i] > perm[i+1]:
            return False
        if a[i] == '>' and perm[i] < perm[i+1]:
            return False
    return True

k = int(input())
a = input().split()
small = [i for i in range(k+1)]
big = [9-i for i in range(k+1)]

while True:
    if check(small,a):
        break
    if not next_perm(small):
        break
while True:
    if check(big, a):
        break
    if not prev_perm(big):
        break

print(''.join(map(str,big)))
print(''.join(map(str,small)))





© 2018. by statssy

Powered by statssy