새소식

PS/백준

[백준/12738] 가장 긴 증가하는 부분 수열 3 (Python)

  • -

Problem : https://www.acmicpc.net/problem/12738

 

12738번: 가장 긴 증가하는 부분 수열 3

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)

www.acmicpc.net

Difficulty : Gold 2

 

Status : Solved

 

Time : 00:05:11

 


 

문제 설명

 

더보기

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

 

입력 및 출력

 

더보기

입력

 

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)

 

출력

 

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

 

입력 예시

 

6
10 20 10 30 20 50

 

출력 예시

 

4

 

 


 

풀이

 

오랜만에 놀러온 골드 2 문제. 풀이는 아래와 같이 DP와 lower bound를 이용하면 된다. O(NlogN)으로 풀 수 있다.

 

2023.09.19 - [알고리즘 문제/백준] - [백준/11722] 가장 긴 감소하는 부분 수열 (Python)

 

[백준/11722] 가장 긴 감소하는 부분 수열 (Python)

Problem : https://www.acmicpc.net/problem/11722 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20,

magentino.tistory.com

 

풀이 코드

N = int(input())
num_list = list(map(int, input().split()))
stk = list()

def lower_bound(val) :
  start, end = 0, len(stk)
  while start < end :
    mid = (start + end) // 2
    if val > stk[mid] :
      start = mid + 1
    else :
      end = mid
  return end

for n in num_list :
  idx = lower_bound(n)
  if idx == len(stk) :
    stk.append(n)
  else :
    stk[idx] = n
print(len(stk))

풀이 완료!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.