[Algorithm] 증가수열 만들기 (그리디)

myeonji·2022년 2월 1일
0

Algorithm

목록 보기
23/89

1부터 N까지의 모든 자연수로 구성된 길이 N의 수열이 주어집니다. 이 수열의 왼쪽 맨 끝 숫자 또는 오른쪽 맨 끝 숫자 중 하나를 가져와 나열하여 가장 긴 증가수열을 만듭니다. 이때 수열에서 가져온 숫자(왼쪽 맨 끝 또는 오른쪽 맨 끝)는 그 수열에서 제거됩니다.예를 들어 2 4 5 1 3 이 주어지면 만들 수 있는 가장 긴 증가수열의 길이는 4입니다.맨 처음 왼쪽 끝에서 2를 가져오고, 그 다음 오른쪽 끝에서 3을 가져오고, 왼쪽 끝에서 4, 왼쪽 끝에서 5를 가져와 2 3 4 5 증가수열을 만들 수 있습니다.

양쪽 끝을 비교해야하므로 lt와 rt 변수를 만들어 각각 맨 왼쪽 인덱스, 맨 오른쪽 인덱스를 가르킨다.
last 변수는 증가수열의 마지막 수를 가르킨다.
따라서 a[lt]나 a[rt]는 last보다 커야 다음 증가수열이 될 수 있다.
last보다 크다는 조건이 성립되면 tmp라는 리스트에 튜플 형식으로 값과 'L' 또는 'R'을 넣는데, 여기서 a[lt]면 'L'을, a[rt]면 'R'을 넣는다.
tmp에 튜플을 오름차순으로 정리면 맨 위의 값이 a[lt]와 a[rt] 중 작은 값이 될테고, 혹은 a[lt] 만 있거나 a[rt] 만 있을 수도 있다.
만약 tmp에 값이 없다면 더이상의 증가수열이 만들어질 수 없다는 것이니 반복문을 나온다.
아무튼, 오름차순의 맨 첫번째 자료를 증가수열에 넣고 그게 왼쪽 자료이면 lt+=1을, 오른쪽 자료이면 rt-=1을 한 후 tmp를 clear 시켜서 반복한다.

<모범답안>

n = int(input())
a = list(map(int, input().split()))

lt = 0
rt = n-1

last = 0
tmp = []
s = ''

while lt <= rt:
    if a[lt] > last:
        tmp.append((a[lt], 'L'))
    if a[rt] > last:
        tmp.append((a[rt], 'R'))
    tmp.sort()

    if len(tmp) == 0:
        break
    else:
        s = s + tmp[0][1]
        last = tmp[0][0]
        if tmp[0][1] == 'L':
            lt += 1
        else:
            rt -= 1
    tmp.clear()

print(len(s))
print(s)

0개의 댓글