일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Python
- 탐색
- BufferedReader
- 다리 만들기
- HashMap
- 브루트포스
- 배열
- Stack
- 스택
- oracle
- 시뮬레이션
- Java
- 완전탐색
- DP
- 구현
- 문자열
- LIS
- 빅데이터
- 새벽코딩
- dfs
- 알고리즘
- 아스키코드
- BFS
- 백준
- Queue
- SQL
- 다이나믹프로그래밍
- 프로그래머스
- 백트래킹
- 그리디
- Today
- Total
새벽코딩
[백준] [11053] 가장 긴 증가하는 부분 수열 (LIS) (JAVA) 본문
※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
문제
수열 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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
※ JAVA 코드 (가장 긴 증가하는 부분 수열)
import java.io.*;
import java.util.*;
public class Main {
static int N, dap;
static int[] A;
// 현재 수열의 크기를 담는다.
static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
// 수열의 크기
N = Integer.parseInt(br.readLine());
// 배열 초기화
A = new int[N];
dp = new int[N];
st = new StringTokenizer(br.readLine());
dap = 1;
for(int i = 0; i < N; i++) {
int a = Integer.parseInt(st.nextToken());
A[i] = a;
dp[i] = 1;
}
// {10, 30, 20, 40, 30, 50}
for(int i = 0; i < N; i++){
for(int j = 0; j < i; j++){
if(A[j] < A[i]){
dp[i] = Math.max(dp[i], dp[j] + 1);
}
if(dap < dp[i]){
dap = dp[i];
}
}
}
System.out.println(dap);
}
}
※ 생각정리 (가장 긴 증가하는 부분 수열)
1. 문제 해석
- 전형적인 LIS문제이다
- 현재까지 가장 긴 길이를 담아가며 진행한다.
LIS에 잘 모른다면 하단의 글을 읽고 옵시다.
https://dawn-of-coding.tistory.com/130
[LIS] 최장 증가 부분 수열(Longest Increasing Subsequence)
알고리즘 문제를 풀다보면 부분수열, 부분증가 수열등 여러 수열문제를 접할 수 있다. 그중 임의의 수열중 가장 긴 증가수열을 만들 수 있는 방법인 최장증가 부분 수열, LIS 알고리즘에 대해 기
dawn-of-coding.tistory.com
이 문제는 수열 단골 문제라 LIS 알고리즘을 해결하는 법을 알고있어야한다. 사실 몰라도 풀수는 있다.. 감으로,,,
2개의 배열을 만들어 한 개는 각 수열을 담고, 나머지 한개는 모두 1을 담아 놓는다.
for(int i = 0; i < N; i++){
for(int j = 0; j < i; j++){
if(A[j] < A[i]){
dp[i] = Math.max(dp[i], dp[j] + 1);
}
if(dap < dp[i]){
dap = dp[i];
}
}
}
이 부분이 매우 중요하다. 현재 좌표의 수와 이전 좌표의 수를 비교하여 현재가 더 크다면 dp배열의 현재 좌표에 값을 담는다. 이때 dp[현재] 좌표에 값과 dp[이전] 좌표에 1을 더한 값. 두 값을 비교하여 더 큰 수를 배열에 담는다.
꾸준함이 기적을 만든다.
- 새벽코딩 -
'알고리즘' 카테고리의 다른 글
[프로그래머스] 2 x n 타일링 (dp) (JAVA) (1) | 2023.06.09 |
---|---|
[프로그래머스] 124 나라의 숫자 (시뮬레이션) (JAVA) (0) | 2023.05.25 |
[백준] [9613] GCD 합 (유클리드) (JAVA) (1) | 2023.05.19 |
[프로그래머스] 게임 맵 최단거리 (BFS) (너비우선탐색) (JAVA) (0) | 2023.05.18 |
[프로그래머스] 공원산책 (시뮬레이션) (JAVA) (0) | 2023.05.17 |