๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 11053๋ฒ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
ํด๊ฒฐ๋ฒ
ํด๋น ๋ฌธ์ ๋ 2์ค ๋ฐ๋ณต DP, ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ DP, ์ด๋ถ ํ์, ์์ ํ์๋ฑ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ ์ด๋ก ์์ ์ฌ์ฉ๋ ์ ์๋ ์ ๋ช ํ ๋ฌธ์ ์ด๋ค.
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด, Longest Increasing Sub Sequence, LIS ๋ผ๊ณ ํ๋ค.
๋ฌธ์ ๋ฅผ ์ดํดํด๋ณด์.
๋ฐฐ์ด arr = {10, 20, 10, 30, 20, 50};
์ด ์๋ค๊ณ ํ์ ๋, ์ฌ๊ธฐ์ LIS๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
arr = 10 20 10 30 20 50
์ด๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด์๋ 2๊ฐ์ง์ ํธ๋ฆญ์ด ํ์ํ๋ค.
- ํ์ฌ ๊ฒ์ฌํ๋ ์์ ๊ฐ์ด ์ ์ ๊ฐ๋ณด๋ค ์ฆ๊ฐํ๋๊ฐ
- ํ์ฌ ๊ฒ์ฌํ๋ ์์ ๊ฐ์ด ์ผ๋งํผ ์ฆ๊ฐํ๋๊ฐ
์ด ๊ฒ์ ๊ตฌํํ๋ ๊ฒ์ด ์ด๋ฒ ๋ฌธ์ ์ ํต์ฌ์ด๋ค
์ ๊ทผ๋ฒ
์ฐ๋ฆฌ๋ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ arr[index]
์ ๊ฐ์ด ์ผ๋ง๋ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ธ์ง ์๊ธฐ ์ํด dp ํ
์ด๋ธ์ ํ๋ ์์ฑํ ๊ฒ์ด๋ค.
ํ์ฌ ๊ฒ์ฌํ๋ ์์ ๊ฐ์ด ์ ์ ๊ฐ๋ณด๋ค ์ฆ๊ฐํ๋๊ฐ
๊ธธ์ด๊ฐ 5์ธ arr ์ 4๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ทธ๋ผ ์ฐ๋ฆฌ๋ arr[0]
~ arr[2]
๊น์ง๋ฅผ 3๋ฒ์งธ ์ธ๋ฑ์ค์ ๋น๊ตํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก 2์ค for๋ฌธ์ด ํ์ํ๋ค.
ํ์ฌ ๊ฒ์ฌํ๋ ์์ ๊ฐ์ด ์ผ๋งํผ ์ฆ๊ฐํ๋๊ฐ
์ด ๊ฒ์ ์กฐ๊ฑด๋ฌธ์ผ๋ก ๋ฝ์ ์ ์๋ค.
์ฐ์ ์ฆ๊ฐ ํ๋๊ฐ์ ๋ํ ์กฐ๊ฑด์ ๊ฐ๋จํ ํ์ฌ ์ธ๋ฑ์ค > j๋ฒ์จฐ ์ธ๋ฑ์ค
๋ก ๊ฒ์ฆํ๋ฉด ๋์ง๋ง ์ผ๋งํผ ์ฆ๊ฐํ๊ณ ์๋์ง๋ฅผ ๊ตฌํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
์ฌ์ค ์ด๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
dp[n] < dp[i] + 1
d[n] = Math.max(d[n], d[i] + 1)
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ํ์ฌ ๊ฒ์ฌํ๋ ์ธ๋ฑ์ค๋ณด๋ค ์์ ์์ dp ํ ์ด๋ธ์์ ํ๋์ฉ ์ ์ง์ ์ผ๋ก ์ฆ๊ฐ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์๋ก ๋ค์๋ฉด 10 20 10 30 ์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋ 30์ 3์ฆ๊ฐ ์์ด์ด๋ค.
๊ทธ๋ผ 30์ด๋ผ๋ ์๊ฐ ์๋ ์ธ๋ฑ์ค์ ์๋ค๊ณ ๊ฐ์ ํ์.
10(์ฆ๊ฐ ์์ด ๊ธธ์ด: 1) 20(2) 9(1) 30(?) ์ํฉ์์ ์ฒซ ๋ฒ์จฐ ์ธ๋ฑ์ค์ธ 10์ 30๋ณด๋ค ์์ผ๋ 30์ ์ฆ๊ฐ ์์ด ๊ธธ์ด๋ 1์ด ๋๊ณ , 2๋ ๋ง์ฐฌ๊ฐ์ง 2๊ฐ ๋๋ค.
ํ์ง๋ง ๊ทธ ๋ค์ ์ธ๋ฑ์ค์ธ 9์ ์ฆ๊ฐ ์์ด์ 1์ธ ๊ธธ์ด์ด๋ค.
์ฌ๊ธฐ์ ๊ธฐ์กด์ ์๋ 10, 20 ์ธ๋ฑ์ค์ ์ฆ๊ฐ ๊ธธ์ด๋ณด๋ค 9์ธ ์ฆ๊ฐ ๊ธธ์ด๊ฐ ๋ ์์ผ๋ฏ๋ก ๋ ํฐ 10, 20 ์ธ๋ฑ์ค ๊ธธ์ด๋ก ํฌํจ์ํค๋ฉด ๋๋ค.
์ด ๊ฒ์ Math.max()
๋ฉ์๋๋ก ๊ฒ์ฌํ ์ ์๋ค.
์ ๋ต ์ฝ๋
์์์ ๋งํ 2๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋๋ก ํ์ด๋ณด๊ฒ ๋ค.
์ฒซ๋ฒ์จฐ ํ์ด
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[] nums = br.readLine().split(" ");
int[] arr = new int[1001];
int[] dp = new int[1001];
for(int i = 0; i < nums.length; i++){
arr[i] = Integer.parseInt(nums[i]);
}
dp[0] = 1;
for(int i = 1; i < n; i++) {
dp[i] = 1;
for(int j = 0; j < i; j++){
if (arr[i] > arr[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int answer = 0;
for(int len: dp) answer = Math.max(len, answer);
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
}
๋ ๋ฒ์จฐ ํ์ด
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[1001];
int[] dp = new int[1001];
String[] nums = br.readLine().split(" ");
for (int i = 0; i < nums.length; i++) {
arr[i] = Integer.parseInt(nums[i]);
}
dp[0] = 1;
for (int i = 1; i <= n; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if(arr[i] > arr[j] && dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
}
}
}
int answer = 0;
for (int i = 0; i < n; i++) {
answer = Math.max(dp[i], answer);
}
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
}
๋ ํ์ด ๋ชจ๋ ๋ ผ๋ฆฌ๊ฐ ๊ฐ์ n^2 ์ด๋ผ ์๊ฐ์ ๋์ผํ๊ฒ 104ms ์๋ค.
๋ฌธ์ ํ๊ณ
ํด๋น ๋ฌธ์ ๋ฅผ ์ฒ์ ๋ณธ ๊ฒ์ ์๋ง ์ํํธ์จ์ด ๋ง์์คํธ๋ก 11๊ธฐ์์ ๊ฒ์ด๋ค.
๊ทธ๋ ๋น์๋ ์ ๋ ฌ๋ก ๋ฌธ์ ๋ฅผ ํ๊ณ ์๊ฐ ๋ณต์ก๋๊ฐ ํต๊ณผ ๋๋์ง ํ๋ ์ผ์ด์ค๋ ๋ง๋์ง ์กฐ์ฐจ ์๊ฐํ์ง ์์๋ค.
ํ์ง๋ง ์ด์ ์๊ฐํด๋ณด๋ ํ๋ ธ์ ๊ฒ ๊ฐ๋ค.
๋๊ธ