• 분류 전체보기 (512)
    • 개발남노씨(Coding Test) (6)
    • 고농축 백엔드 (17)
    • 재귀함수 DFS 총정리 (1)
    • 프론트엔드 날개달기:Vuejs.React (1)
    • 훈훈한 javascript (5)
    • 렛츠기릿 자바스크립트 (18)
    • 나도코딩 (1)
      • 웹 스크래핑 (1)
    • 프로그래머스(자바스크립트) (41)
      • LV.0(자바스크립트) (41)
    • 프로그래머스(자바) (121)
      • LV.0(자바) (56)
      • LV.1(자바) (41)
      • LV.2(자바) (23)
    • 프로그래머스(파이썬) (127)
      • LV.0(파이썬) (46)
      • LV.1(파이썬) (51)
      • LV.2(파이썬) (30)
    • 임시저장소 (31)
    • 프로젝트 (0)
    • 자바 알고리즘 (13)
      • 알고리즘 직빵 자바 문법 (10)
      • String(문자열) (3)
    • 파이썬 알고리즘 (93)
      • 알고리즘 직빵 파이썬 문법 (20)
      • 알고리즘 백준 (2)
      • 파이썬 알고리즘(사고력기르기) (6)
      • 파이썬 탐색 & 시물레이션 (8)
      • 이분탐색 & 그리디 알고리즘 (10)
      • 스택, 큐, 해쉬, 힙 (10)
      • 완전탐색과 DFS기초 (12)
      • DFS, BFS 활용 (19)
      • 동적계획법 (6)
    • 자바 (27)
      • Java TPC(생각하고, 표현하고, 코딩하고) (17)
      • Java (중요하고, 이해 안 되고, 어려운) (10)
    • 스프링 (5)
      • 스프링 MVC 패턴 2편 (5)
hELLO · Designed By 정상우.
@@#@@

기록용 블로그

파이썬 알고리즘/이분탐색 & 그리디 알고리즘

9. 증가 하는 수열 만들기

2022. 11. 3. 22:43

문제

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

 

 

 

문제풀이

import sys
sys.stdin=open("input.txt", "r")

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


last =0
lt = 0
rt = n-1
res =""
tmp =[]

while lt<=rt:
    if p[lt]>last:
        tmp.append((p[lt], 'L'))
    if p[rt]>last:
        tmp.append((p[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=lt+1
        else:
            rt=rt-1
    tmp.clear()

print(len(res))
print(res)

 

 

해설

last 용도 : 수열을 만들기 위해서 이전 값보다 큰 값을 넣어야 하는데, 

                 "이전 값보다 커야지"할 때의 이전값을 의미한다. 

 

전체 사이클

tmp에 a[lt] 1개가 들어 갈 수도 있고,

tmp에 a[rt] 1개가 들어 갈 수도 있다.

tmp에 a[lt]와 a[rt] 2개가 들어 갈 수도 있다.

 

tmp리스트를 정렬했는데,

tmp에 아무것도 들어 가지 않는 경우는

더 이상 수열을 만들 수 없으므로 반복문을 종료

 

else:

tmp에 1개 또는 2개가 들어갔든

맨 앞쪽의 요소(tmp[0])의 두번째 값(tmp[0][1])을 res에 저장한다.

 

※만약에 tmp에 좌측값과 우측값 1개개씩 값이 들어 갔다면, 둘 중 한쪽만 처리되고, 한쪽만 +1 증가 되므로

 

처리 되지 않은 다른 한쪽은 인덱스 값이 변화가 없으므로 while반복시 이전 값이 재사용된다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬 알고리즘 > 이분탐색 & 그리디 알고리즘' 카테고리의 다른 글

10. 역수열 (그리디)  (0) 2022.11.04
8.침몰하는 타이타닉(그리디)  (0) 2022.11.03
7. 창고정리  (0) 2022.11.03
6. 씨름 선수(그리디)  (0) 2022.11.03
5. 회의실 배정  (0) 2022.11.03
    '파이썬 알고리즘/이분탐색 & 그리디 알고리즘' 카테고리의 다른 글
    • 10. 역수열 (그리디)
    • 8.침몰하는 타이타닉(그리디)
    • 7. 창고정리
    • 6. 씨름 선수(그리디)
    @@#@@
    @@#@@
    자바, 스프링, 알고리즘, 깃허브, 파이썬

    티스토리툴바