문제
수열 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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int[] dp = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
dp[0] = 1;
for (int i = 1; i < N; i++) {
dp[i] = 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 = dp[0];
for (int i = 1; i < N; i++) {
if (max < dp[i]) {
max = dp[i];
}
}
System.out.println(max);
}
}
이 코드는 가장 긴 증가하는 부분 수열(LIS, Longest Increasing Subsequence)을 구하는 문제입니다. BufferedReader를 사용하여 입력을 처리하고, dp 배열을 사용하여 부분 수열의 길이를 저장하고 업데이트합니다. 마지막으로 dp 배열에서 최댓값을 찾아 출력합니다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String args[])throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int arr[] = new int[n];//숫자 저장
int dp[] = new int[n];//최댓값 저장
//st사용해야 하는거 까먹음
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0;i<n;i++){
arr[i]=Integer.parseInt(st.nextToken());
}
dp[0]=1;
for(int i=1;i<n;i++){
dp[i]=1;
//j는 i보다 작을 때 까지
for(int j=0;j<i;j++){
if(arr[j]<arr[i] && dp[i]<dp[j]+1){
dp[i]=dp[j]+1;
}
}
}
int max=dp[0];
for(int i=1;i<n;i++){
if(max<dp[i]){
max=dp[i];
}
}
System.out.println(max);
}
}
'코딩테스트 > ⚪백준_ 단계별로 풀어보기' 카테고리의 다른 글
[JAVA][부르트포스] 6064번 카잉달력 (0) | 2023.06.05 |
---|---|
[DP][JAVA]구간 합 구하기 5 (0) | 2023.05.24 |
[DP][JAVA] 2579번 계단오르기 (0) | 2023.05.21 |
[DP][JAVA/python] 1로 만들기 (0) | 2023.05.20 |
[분할정복][JAVA] 레벨 햄버거 16974 (0) | 2023.05.17 |