728x90
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
LIS
가장 긴 증가하는 부분 수열을 구하는 문제를 LIS라고 한다. Longest Increasing Subsequence의 약자로, 배열의 일부 원소를 골라서 만든 부분 수열 중 각 원소가 이전 값보다 크다는 조건을 만족하는 가장 긴 수열을 뜻한다.
이번 문제는 수열의 길이 N의 최댓값이 1,000이기 때문에 시간 복잡도에 관계 없이 이중 for문을 돌릴 수 있었다. num은 원소를 순서대로 저장해놓은 배열이고, len은 해당 원소까지의 가장 긴 증가하는 부분 수열의 크기를 저장한다. 따라서 현재 원소보다 작은 원소 중 가장 큰 len 값 + 1이 현재 원소가 포함된 가장 긴 증가하는 부분 수열의 크기이다.
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 시간 : 96ms
// 메모리 : 11904KB
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] num = new int[N + 1];
int[] len = new int[N + 1];
for (int i = 1; i <= N; i++) {
num[i] = Integer.parseInt(st.nextToken());
}
int max = 0;
for (int i = 1; i <= N; i++) {
for (int j = 0; j < i; j++) {
if(num[j] >= num[i]) continue;
if(len[i] < len[j] + 1) len[i] = len[j] + 1;
}
if(max < len[i]) max = len[i];
}
System.out.println(max);
}
}
반응형
'JAVA > 문제 풀이' 카테고리의 다른 글
[백준 / BOJ] 17069번 : 파이프 옮기기 2 - JAVA (1) | 2023.10.15 |
---|---|
[백준 / BOJ] 30206번 : 차량 배치 - JAVA (0) | 2023.10.10 |
[백준 / BOJ] 30205번 : 전역 임무 - JAVA (0) | 2023.10.09 |
[백준 / BOJ] 10942번 : 팰린드롬? - JAVA (0) | 2023.10.09 |
[백준 / BOJ] 17472번 : 다리 만들기 2 - JAVA (0) | 2023.10.09 |