Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- BSD소켓
- web-proxy lab
- TCP
- mysql
- group by
- strcpy
- https://firecatlibrary.tistory.com/49?category=874970
- 정글#정글사관학교#3기#내일#기대#설렘#희망#노력
- Error Code: 1055
- C언어
- https://coding-factory.tistory.com/641
- strcat
- ip
- HTTP
- SQL
- DNS
Archives
- Today
- Total
매일을 설렘으로
[Python] 백준 11053번 가장 긴 증가하는 부분수열 본문
문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
나의 풀이
N이 1000이면, O(N^2)의 시간 복잡도를 가져도 문제가 안될거같다. 만약 다음 원소와 이전 원소와의 비교로 증가하는 부분 수열을 고르게 되면,
6
10, 20, 5, 7, 8, 50를 반례로 들 수 있다.
오답) 3개 / 10, 20, 5, 7, 8, 50
정답) 4개 / 10, 20, 5, 7, 8, 50
컴퓨터는 원소의 주변의 대소관계만의 비교로는 해결할 수 없을거같다. 별도 기억하는 변수가 있어야하고, 그렇다면 뭘 기억해야할까? list를 끊어서 생각해보면...
아래는 Dynamic Programming을 이용한 풀이다. 시간 복잡도를 생각해보면 모든 원소를 돌면서 이전의 원소들을 다 돌아야하기 때문에 O(N^2)이 될 것이다.
import sys
n = int(input())
arr = list(map(int, sys.stdin.readline().split()))
count = [1] * n #각 자리의 정보값을 저장해두고 나중에 쓰인다.
for i in range(n):
for j in range(i):
if arr[j] < arr[i]:
count[i] = max(count[i], count[j] + 1)
print(max(count))
'알고리즘' 카테고리의 다른 글
[Python] 백준 10830번 행렬 제곱 (0) | 2021.11.17 |
---|---|
[Python] 백준 2630번 색종이 만들기 (0) | 2021.11.17 |
[Python] 백준 2110번 공유기 설치 (0) | 2021.11.17 |
[Python] 백준 13334번 철로 (0) | 2021.11.17 |
[Python] 백준 2470번 두 용액 문제 (0) | 2021.11.15 |