본문 바로가기
알고리즘?/이분탐색(결정알고리즘)&그리디 알고리즘

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

by 몰라닉네임 2023. 7. 19.

[문제 아이디어]

투 포인터 활용

 

튜플 형태로 append

 

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

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

 

import sys
sys.stdin = open("input.txt", "rt")
'''
3 2 10 1 5 4 7 8 9 6 

3 L ,   6 R, 9 R,  
'''
n = int(input())
a = list(map(int, input().split()))

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

 

*본 문제는 인프런 김태원 강사님의 파이썬 알고리즘 문제풀이 강의에 기반합니다.