본문 바로가기

숨막히는 알고말고/문제 풀이

[SWEA] 최장 증가 부분 수열

👀 문제 설명

문제

로그인해야 문제를 볼 수 있다.

 

✍🏻풀이

DP를 사용해 각 자리까지의 최장 증가 수열을 저장한다.

 

nums는 입력받은 숫자 배열이고, dp는 각 자리까지의 최장 증가 수열을 저장하는 배열이다.

dp[0]은 제일 앞에 있는 값이므로 1로 두고 시작한다.

i = 1 부터 N - 1까지 접근해 각 자리의 최장 증가 수열을 구한다.

현재자리의 최장 증가 수열은 나의 앞에서 나보다 작은 애들 중의 최장 증가 수열 + 1이다.

예를 들어, nums가 1, 3, 2, 5, 4일 경우 dp[3]을 구하려면

인덱스 0부터 2까지 돌면서 나보다 작은 애들의 최장 증가 수열의 최댓값을 구한다.

nums[0], nums[1], num[2] 모두 5보다 작으므로, 얘들의 dp값을 비교하여 최댓값을 가져온다.

그 최댓값에 +1을 하면 dp[3]을 구할 수 있는 것이다.

 

코드

package swea;

// 최장 증가 부분 수열 (https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWBOKg-a6l0DFAWr&categoryId=AWBOKg-a6l0DFAWr&categoryType=CODE&problemTitle=%EC%B5%9C%EC%9E%A5&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 )

import java.util.*;
import java.io.*;

public class SWEA_3307 {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		int T;

		T = Integer.parseInt(br.readLine());

		for (int tc = 1; tc <= T; tc++) {
			// input
			int N = Integer.parseInt(br.readLine());
			int nums[] = new int[N];
			
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < N; i++) {
				nums[i] = Integer.parseInt(st.nextToken());
			}
			
			// solve
			int dp[] = new int[N];
			dp[0] = 1;
			for (int i = 1; i < N; i++) {
				int leftMax = 0;
				
				for (int j = i - 1; j >= 0; j--) {
					if (nums[j] <= nums[i]) {
						leftMax = Math.max(leftMax, dp[j]);
					}
				}
				
				dp[i] = leftMax + 1;
			}
			
			int max = 0;
			for (int i = 0; i < N; i++) {
				max = Math.max(max, dp[i]);
			}
			
			bw.write("#" + tc + " " + max + "\n");
		}

		bw.flush();
		bw.close();
	}

}

'숨막히는 알고말고 > 문제 풀이' 카테고리의 다른 글

[Baekjoon] 모노미노도미노 2  (0) 2021.10.06
[SWEA] 특이한 자석  (0) 2021.10.01
[SWEA] 탈주범 검거  (0) 2021.09.30
[SWEA] 보급로  (0) 2021.09.30
[SWEA] 키 순서  (0) 2021.09.29