본문 바로가기
공부 정리/백준

[백준] 자바 11053 가장 긴 증가하는 부분 수열

by 경적필패. 2021. 7. 22.
반응형

문제

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


테스트 케이스

 

(1)
초록색 입력 / 검은색 출력

 


접근

원하는 수만큼 수열을 입력받아서 해당 수열에서 증가하는 부분 수열의 최대 크기를 구하는 문제입니다.

예를 들면

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

댓글