문제
수열 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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
테스트 케이스
접근
원하는 수만큼 수열을 입력받아서 해당 수열에서 증가하는 부분 수열의 최대 크기를 구하는 문제입니다.
예를 들면
5 6 3 4 수열에서 증가 부분 수열은
3
4
5
6
5,6
3,4
가 있으므로 이 문제에서 원하는 답은 최대 크기인 2입니다.(5,6이나 3,4)
10 20 10 30을 이용해 이문제를 풀 수 있는 규칙을 설명하겠습니다.
첫 번째 수는 무조건 최대 크기가 1이므로
10 20 10 30
1
이 됩니다.
두 번째 수도 기본 크기를 1로 지정해놓고, 이전 값보다 크면 1을 더해주는 식으로 계산합니다.
10 20 10 30
1 1->2(20이 10보다 큼)
세 번째 수도 1로 지정해놓고, 이전 값들을 비교하여 10보다도 안 크고 20보다 안 크므로 1로 고정됩니다.
10 20 10 30
1 2 1
4번째 수 30도 1로 지정해놓고, 이전 값들을 비교하여 10보다 크고, 1보다 크거나 같고 그러므로 +1
그다음 수(20)와도 비교했을때, 20보다 크고 2보다 크니 +1
그 다음 수(10)와도 비교해 봤을 때, 10보다는 작고 1보다도 크기 때문에 유지시켜서 총 3이 됩니다.
10 20 10 30
1 2 1 3
즉 이전 값과 이전 최대 개수의 값들을 비교하여
이전 값보다 큰가? && 이전 최대 개수 값보다 작거나 같은가? 두 가지로 비교하여
최대 개수를 채워 나가서
최종적으로 그 값들의 최댓값을 출력하니 문제가 해결되었습니다.
코드
import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
/*
11053 problem
*/
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
ArrayList<Integer> arr = new ArrayList<>();
ArrayList<Integer> result = new ArrayList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int max = 0;
for(int i=0; i<num; i++) {
arr.add(Integer.parseInt(st.nextToken()));
}
result.add(1);
for(int i=1; i<num; i++) {
result.add(1);
for(int j=0; j<i; j++) {
if(arr.get(i)>arr.get(j) && result.get(j)>=result.get(i)) {
result.set(i,result.get(j)+1);
}
}
}
for(int i=0; i<result.size(); i++) {
if(max<result.get(i)) {
max = result.get(i);
}
}
bw.write(String.valueOf(max));
bw.flush();
bw.close();
}
}
주의
x
'공부 정리 > 백준' 카테고리의 다른 글
[백준] 자바 1912 연속합 (0) | 2021.07.26 |
---|---|
[백준] 자바 14501 퇴사 (0) | 2021.07.23 |
[백준] 자바 2579 계단 오르기 (0) | 2021.07.21 |
[백준] 자바 11726 2 x n 타일링 (0) | 2021.07.20 |
[백준] 자바 9095 1, 2, 3 더하기 (0) | 2021.07.19 |
댓글