증가수열 만들기/Python/파이썬/그리디 알고리즘

heeee·2021년 1월 17일
0

algorithm

목록 보기
49/123
post-custom-banner

💡문제

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

입력

첫째 줄에 자연수 N(3<=N<=100)이 주어집니다.
두 번째 줄에 N개로 구성된 수열이 주어집니다.

출력

첫째 줄에 최대 증가수열의 길이를 출력합니다.
두 번째 줄에 가져간 순서대로 왼쪽 끝에서 가져갔으면 ‘L', 오른쪽 끝에서 가져갔으면 ’R'를 써
간 문자열을 출력합니다.(단 마지막에 남은 값은 왼쪽 끝으로 생각합니다.)

예제입력

5
2 4 5 1 3

예제출력

4
LRLL

📖내가 작성한 code

#1

from collections import deque
n=int(input())
a=list(map(int,input().split()))
a=deque(a)
res=''
before=0
while True:
    if len(a) == 0:
        break
    if before>max(a[0],a[-1]):
        break
    else:
        if a[0]>before:
            if a[-1]<before or a[0]<a[-1]:
                before=a[0]
                a.popleft()
                res+='L'
        if a[-1]>before:
            if a[0]<before or a[-1]<a[0]:
                before=a[-1]
                a.pop()
                res+='R'
print(len(res))
print(res)

#2

n=int(input())
a=list(map(int,input().split()))
lt=0
rt=n-1
res=""
last=0
tmp=[]

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:
        res=res+tmp[0][1]
        last=tmp[0][0]
        if tmp[0][1]=='L':
            lt+=1
        else:
            rt-=1
    tmp.clear()
print(len(res))
print(res)
post-custom-banner

0개의 댓글