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

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

 

▣ 입력설명

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

 

▣ 출력설명

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

 

▣ 입력예제 1

5
2 4 5 1 3

 

▣ 출력예제 1

4
LRLL

 

▣ 입력예제 2

10
3 2 10 1 5 4 7 8 9 6

 

▣ 출력예제 2

3
LRR

 


코드

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

string = "" # 출력 LR문자열
lt, rt = 0, n-1 # 왼쪽 끝, 오른쪽 끝 포인터 변수
last = 0
tmp = []

while lt<=rt:
    if arr[lt] > last:
        tmp.append((a[lt], 'L')) # 튜플 값으로 넣는다.
    if arr[rt] > last:
        tmp.append((a[rt], 'R'))
    tmp.sort() # 튜플의 첫 자료 값에 대해서 정렬한다.
    if len(tmp)==0: # 종료조건 : 추가된 tmp가 없다면 종료
        break
    else: # 추가된 tmp가 존재한다면 진행
        string = string + tmp[0][1] 
        last = tmp[0][0] 
        if tmp[0][1]=='L':
            lt+=1
        else:
            rt-=1
    tmp.clear()

print(len(string))
print(string)

 

'⏰ 코딩테스트 > 그리디' 카테고리의 다른 글

역수열  (0) 2021.10.12
침몰하는 타이타닉  (0) 2021.10.09
창고 정리  (0) 2021.10.08
씨름 선수  (0) 2021.10.08
백준 알고리즘 - 1931 - 회의실 배정  (0) 2021.10.07
복사했습니다!