Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

연습장/백준(BOJ) 문제풀이

[백준 11053] 가장 긴 증가하는 부분 수열 with Python

2021. 5. 29. 22:34

문제 링크

https://www.acmicpc.net/problem/11053

 

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

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

www.acmicpc.net

풀이

import sys

N = int(sys.stdin.readline())
seq = list(map(int, sys.stdin.readline().split()))
dp = [seq[0]]

def binary(dp, n):
    low = 0
    high = len(dp)-1
    while low <= high:
        mid = (low + high)//2
        if dp[mid] > n:
            high = mid - 1
        elif dp[mid] < n:
            low = mid + 1
        else:
            return mid

    return high+1

for i in seq:
    if i > dp[-1]:
        dp.append(i)
    else:
        dp[binary(dp, i)] = i

print(len(dp))

 

수열을 seq에 저장하고 seq을 순회하면서 dp의 가장 마지막 요소(dp의 최댓값)보다 크면 dp의 마지막에 추가하고, 그렇지 않다면 이분 탐색을 통해 오름차순으로 dp의 몇 번째 인덱스에 들어갈 수 있는지 찾아서 해당 인덱스의 요소를 현재 순회중인 seq의 요소 i로 대체한다. dp[i]는 수열의 (i+1)번째 숫자로 끝나는 부분 수열의 최대 길이이다.

 

seq = [1, 2, 1, 6, 4, 5]일 때,

1. 먼저 dp에 seq[0]이 이미 있기 때문에 seq의 첫 번째 수 1을 순회하고 난 뒤 dp는 [1]이다.

2. 2는 dp의 최댓값보다 크기 때문에 dp는 [1, 2]가 된다.

3. 1은 이미 있는 수이기 때문에 dp는 변하지 않는다. (binary(dp, 1)이 0을 반환하므로)

4. 6은 dp의 최댓값보다 크기 때문에 dp는 [1, 2, 6]이 된다.

5. 4는 2와 6 사이에 위치하므로, 6을 대체하여 dp는 [1, 2, 4]가 된다.

6. 5는 dp의 최댓값보다 크기 때문에 dp는 [1, 2, 4, 5]가 된다.

저작자표시 비영리 (새창열림)

'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글

[백준 2630] 색종이 만들기 with Node.js  (0) 2021.06.04
[백준 1004] 어린 왕자 with Node.js  (0) 2021.05.29
[백준 10974] 모든 순열 with Node.js  (0) 2021.05.25
[백준 1012] 유기농 배추 with Python  (0) 2021.05.25
[백준 2003] 수들의 합 2 with Node.js  (0) 2021.05.24
    '연습장/백준(BOJ) 문제풀이' 카테고리의 다른 글
    • [백준 2630] 색종이 만들기 with Node.js
    • [백준 1004] 어린 왕자 with Node.js
    • [백준 10974] 모든 순열 with Node.js
    • [백준 1012] 유기농 배추 with Python
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바