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 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @BeforeAll
- @BeforeEach
- @Builder
- @Entity
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Query
- @Table
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
Archives
- Today
- Total
기록
백준_가장 긴 증가하는 수열 세트 (1) 본문
문제
https://www.acmicpc.net/problem/11053
https://www.acmicpc.net/problem/12015
https://www.acmicpc.net/problem/12738
https://www.acmicpc.net/problem/14002
https://www.acmicpc.net/problem/14003
풀이
1) 가장 긴 증가하는 수열 1
[10, 60, 20, 10, 30, 20, 50] 이 주어졌다고 할 떄 아래처럼 표현할 수 있다.
index | item | 증가하는 수열 | 수열의 길이 |
0 | 10 | 10 | 1 |
1 | 60 | 10, 60 | 2 |
2 | 20 | 10, 20 | 2 |
3 | 10 | 10 | 1 |
4 | 30 | 10, 20, 30 | 3 |
5 | 20 | 10, 20 | 2 |
6 | 50 | 10, 20, 30, 50 | 4 |
4번째 증가하는 수열의 길이를 구한다고 하자.
1. 0~3번째 중 item이 30보다 작은 경우를 확인한다.
2. 그 중 가장 긴 수열의 끝에 30을 덧붙인다.
수열의 길이를 1차원 리스트(dp)에 저장해두고, 반복 연산한다.
2) 가장 긴 증가하는 수열 4
가장 긴 증가하는 수열1을 응용한다. dp에 적혀있는 수열의 길이를 이용한다. 위의 예시를 사용하면, 아래와 같은 dp를 얻을 수 있다.
dp = [1, 2, 2, 1, 3, 2, 4]
가장 오른쪽 원소부터 거꾸로 접근하면서, 수열의 원소들을 찾아 넣는다.
1. 4를 찾는다. → index = 6, item = 50
2. 3을 찾는다. → index = 4, item = 30
3. 2을 찾는다. → index = 2, item = 20
4. 1을 찾는다. → index = 0, item = 10
거꾸로 출력해준다. → 50 30 20 10
코드
1) 가장 긴 증가하는 수열 1
import sys
input = sys.stdin.readline
N = int(input().strip())
arr = list(map(int, input().strip().split()))
dp = [1, ]*N
# 오른쪽으로 가면서 찾기
for now in range(N) :
# 왼쪽에서 작은 값 찾기
for prev in range(now) :
if arr[prev]<arr[now] :
dp[now] = max(dp[now], dp[prev]+1)
count = max(dp) # 가장 긴 배열의 길이
print(count)
2) 가장 긴 증가하는 수열 4
import sys
input = sys.stdin.readline
N = int(input().strip())
arr = list(map(int, input().strip().split()))
dp = [1, ]*N
# 오른쪽으로 가면서 찾기
for now in range(N) :
# 왼쪽에서 작은 값 찾기
for prev in range(now) :
if arr[prev]<arr[now] :
dp[now] = max(dp[now], dp[prev]+1)
count = max(dp) # 가장 긴 배열의 길이
print(count)
# 추적해서 배열 찾기
answer = list()
for i in range(N-1, -1, -1) :
if dp[i] == count :
answer.append(arr[i])
count -= 1
# 출력하기
for it in answer[::-1] : print(it, end = " ")
'코딩테스트 > python' 카테고리의 다른 글
백준_20040_사이클 게임 (0) | 2022.04.03 |
---|---|
백준_12100_2048 (Easy) (0) | 2022.04.02 |
백준_1937_욕심쟁이 판다 (0) | 2022.03.22 |
백준_2169_로봇 조종하기 (0) | 2022.03.22 |
백준_4386_별자리 만들기 (0) | 2022.03.17 |
Comments