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
- java
- 리트코드
- 이진탐색
- DP
- 완전탐색
- javascript
- two pointers
- 백준
- greedy
- dynamic programming
- 방송통신대학교
- algorithm
- sliding window
- 방통대
- 자바
- 코테
- LeetCode
- 방송대
- 컴퓨터과학과
- 자바스크립트
- 알고리즘
- 투포인터
- Binary Search
- 깃
- boj
- 코딩
- 탐욕알고리즘
- it
- Git
- 그리디
Archives
- Today
- Total
개발이 취미인 주니어 기획자
[DP][Java][BOJ] #11053. 가장 긴 증가하는 부분 수열 본문
728x90
반응형
#DP #Silver2
https://www.acmicpc.net/problem/11053
🌷 문제 설명
✏️ 백준 연습문제: #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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
입출력 예
| 입력 | 출력 |
| 6 10 20 10 30 20 50 |
4 |
| 7 5 1 6 2 7 3 8 |
4 |
💡 해결 포인트
1. 가장 처음에 오는 수가 가장 작은 수가 아닐 수도 있다는 점!
2. dp[i]는 수열의 i번째 숫자를 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이
- 이전 숫자들 중 자기보다 작은 숫자를 찾아, 가장 긴 길이에 +1
3. 풀이 순서(5 1 6 2 7 3 8의 경우)
(1) dp[]를 1로 초기화 시키자(가장 긴 증가하는 부분 수열 길이 중 가장 작은 값)
=> [1, 1, 1, 1, 1, 1, 1]
(2) dp[0]
→ arr[0] = 5
→ 앞에 숫자가 없으므로 dp[0] = 1
(3) dp[1]
→ arr[1] = 1
→ arr[0] = 5
→ 앞에 숫자가 나보다 크므로 dp[1] = 1
(4) dp[2]
→ arr[2] = 6
→ 앞에 숫자(arr[0] or arr[1]) 둘 다 더 작은 값임
→ arr[0] = 5 => dp[2] = dp[0] + 1 = 2
→ arr[1] = 1 => d[2] = dp[1] + 1 = 2
→ 둘 중 더 긴 값 선택해서 dp[2]에 할당
(5) dp[3]
→ arr[3] = 2
→ 앞에 숫자 arr[1]만 arr[3]보다 작음 (1 < 2)
→ dp[3] = dp[1] + 1 = 2
(6) dp[4]
→ arr[4] = 7
→ arr[0], arr[1], arr[2], arr[3] 전부 작음
→ dp = [1, 1, 2, 2, 1, 1, 1] 이므로 가장 긴 dp[2], dp[3]에 1을 더한 수를
→ dp[4] = 3
(7) dp[5]
→ arr[5] = 3
→ arr[2], arr[3]만 작음. dp[2], dp[3] 수는 동일하므로 여기에다 1을 더한수를
→ dp[5] = 3
(8) dp[6]
→ arr[6] = 8
→ arr[0], arr[1], arr[2], arr[3], arr[4], arr[5] 전부 작음
→ 지금까지 갱신된 dp = [1, 1, 2, 2, 3, 3, 1] 이므로 가장 긴 dp[5]에 1을 더한 값을
→ dp[6] = 4
🌷 내 코드
1. DP
import java.io.*;
import java.util.*;
public class BOJ_11053 {
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("example.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 수열의 크기
int[] arr = new int[N]; // 수열
int[] dp = new int[N]; // 가장 긴 증가하는 부분 수열
String[] line = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(line[i]);
}
for (int i = 0; i < N; i++) {
dp[i] = 1; // 초기값 1
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i] && dp[i] < dp[j] + 1) { // 나보다 작은 수가 있으면
dp[i] = dp[j] + 1; // 수열 증가시키기
}
}
}
int max = 0;
for (int i = 0; i < N; i++) {
max = Math.max(max, dp[i]);
}
System.out.println(max);
}
}
🌷 코멘트
처음에 최댓값 갱신 방신으로 생각했다가 틀렸다! 그치 이렇게 쉬울거면 실버2일리가 없지...ㅠ
A={5, 1, 6, 2, 7, 3, 8} 인 경우를 생각해보기!
DP라는 거.. 내가 생각 해 낼 수 있는 범위의 내용인 걸까?
블로그 내용에 문제가 있다면 댓글 혹은 아래로 연락주세요!
~대가리 꽃밭인 디지털 노마드가 꿈이예요~
🧚♀️ Gyumin Lee
📧 gyumin.q.lee@gmail.com
qminlee723 - Overview
noob. qminlee723 has 8 repositories available. Follow their code on GitHub.
github.com
728x90
반응형
'문제 풀이 > 알고리즘 문제 풀이' 카테고리의 다른 글
| [DP][Java][BOJ] #2225. 합분해 (0) | 2025.02.21 |
|---|---|
| [DP][Java][BOJ] #9251. LCS (0) | 2025.02.20 |
| [DP][Java][BOJ] #1003. 피보나치 함수 (0) | 2025.02.18 |
| [Greedy][Java][BOJ] #19598. 최소 회의실 개수 (0) | 2025.02.15 |
| [Greedy][Java][BOJ] #1946. 신입 사원 (0) | 2025.02.14 |