💯Problem Solving

[BOJ] 12738 가장 긴 증가하는 부분 수열 3

date
Aug 5, 2023
slug
boj-12738
author
status
Public
tags
Python
BOJ
summary
백준 12738번 문제풀이입니다.
type
Post
thumbnail
category
💯Problem Solving
updatedAt
Aug 26, 2023 11:06 AM

문제 링크


문제


수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {1020, 10, 30, 20, 50} 이고, 길이는 4이다.

문제풀이


가장 긴 증가하는 부분 수열을 구하는 알고리즘은
  1. DP
  1. 이분탐색이 있다
 
DP를 통해 문제를 풀게되면 최악의 경우 N^2의 시간복잡도가 걸릴 수 있어
이문제에서의 ≤ 1,000,000에 걸리게된다.
 
이분탐색을 통해 어떤식으로 문제를 해결할 수 있는지 알아보자
 
이분탐색을 사용한다는것은,
배열전체를 딱 한번만 훑어서 NlogN만큼의 시간복잡도를 가지게끔 하는건데
 
길이를 구하기위해 배열을 하나만들고
1~N까지 선형 탐색을한다
  1. 배열이 비어있을때?
    1. 배열에 삽입
  1. 배열이 비어있지 않을떄
    1. 만약 탐색한 원소가 가장 뒤에있는 원소보다 크다면 가장 뒤에 삽입
    2. 크지 않다면 배열을 대상으로 탐색한 원소가 어느자리에 들어갈 수 있는지 Lower Bound를 구해주어
    3. 그 위치의 값을 탐색한 원소의 값으로 바꾸어준다.
 
파이썬 문제풀이 코드
import bisect N = int(input()) arr = [] for item in map(int, input().split()): if not arr: arr.append(item) elif arr: if arr[-1] < item: arr.append(item) else: idx = bisect.bisect_left(arr, item) # 어디들어갈 수 있는지 찾는다 arr[idx] = item print(len(arr))
 
시간복잡도

    입력


    첫째 줄에 수열 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

    알고리즘 분류


    • 구현
    • 문자열