๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/11054
๐ ๋ฌธ์ ์์ฝ
- ๋ฐ์ดํ ๋ ์์ด: ์ฆ๊ฐํ๋ค๊ฐ ๊ฐ์ํ๋ ํํ์ ์์ด
- ์์ด์์ ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
- ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด(LIS)๊ณผ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด(LDS)์ ๊ฒฐํฉํ์ฌ ํด๊ฒฐ
๐ ํ์ด ๋ฐ ์๊ณ ๋ฆฌ์ฆ
- dp1[i]: nums[i]๋ฅผ ๋ง์ง๋ง ์์๋ก ํ๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด (LIS).
- dp1[i] = max(dp1[i], dp1[j] + 1) (nums[i] > nums[j])
- dp2[i]: nums[i]๋ฅผ ์ฒซ ์์๋ก ํ๋ ๊ฐ์ฅ ๊ธด ๊ฐ์ ๋ถ๋ถ ์์ด (LDS).
- dp2[i] = max(dp2[i], dp2[j] + 1) (nums[i] > nums[j])
- ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด ๊ณ์ฐ
- dp1[i] + dp2[i] - 1 (์ค์๊ฐ nums[i]๊ฐ ์ค๋ณต๋๋ฏ๋ก -1
๐ก ์ฝ๋
public class Baekjoon_11054 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
int[] dp1 = new int[n]; // LIS
int[] dp2 = new int[n]; // LDS
for (int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
}
// 1. LIS (์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ)
dp1[0] = 1;
for (int i = 1; i < n; i++) {
for (int j = i - 1; j >= 0; j--) {
if (nums[i] > nums[j]) {
dp1[i] = Math.max(dp1[i], dp1[j] + 1);
}
}
}
// 1. LDS (์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ)
dp2[n - 1] = 1;
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
if (nums[i] > nums[j]) {
dp2[i] = Math.max(dp2[i], dp2[j] + 1);
}
}
}
// 3. ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด ๊ธธ์ด ๊ณ์ฐ
int ans = 0;
for (int i = 0; i < n; i++) {
int cnt = dp1[i] + dp2[i];
ans = Math.max(ans, cnt);
}
System.out.println(ans - 1); // ์ค์๊ฐ์ ๊ฒน์น๋ฏ๋ก -1
}
}
๐ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- LIS (O(Nยฒ)) + LDS (O(Nยฒ) = O(Nยฒ)
- N โค 1000์ด๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(1,000,000)
'์๊ณ ๋ฆฌ์ฆ(JAVA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2225 "ํฉ๋ถํด" (JAVA) (0) | 2025.02.20 |
---|---|
๋ฐฑ์ค 9251 "LCS (์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)" (JAVA) (0) | 2025.02.19 |
๋ฐฑ์ค 11053 & 11722 "๊ฐ์ฅ ๊ธด ์ฆ๊ฐ/๊ฐ์ ๋ถ๋ถ ์์ด" (JAVA) (0) | 2025.02.18 |
๋ฐฑ์ค 1316 "๊ทธ๋ฃน ๋จ์ด ์ฒด์ปค" (JAVA) (0) | 2025.02.18 |
๋ฐฑ์ค 1003 "ํผ๋ณด๋์น ํจ์" (JAVA) (0) | 2025.02.17 |
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/11054
๐ ๋ฌธ์ ์์ฝ
- ๋ฐ์ดํ ๋ ์์ด: ์ฆ๊ฐํ๋ค๊ฐ ๊ฐ์ํ๋ ํํ์ ์์ด
- ์์ด์์ ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
- ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด(LIS)๊ณผ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด(LDS)์ ๊ฒฐํฉํ์ฌ ํด๊ฒฐ
๐ ํ์ด ๋ฐ ์๊ณ ๋ฆฌ์ฆ
- dp1[i]: nums[i]๋ฅผ ๋ง์ง๋ง ์์๋ก ํ๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด (LIS).
- dp1[i] = max(dp1[i], dp1[j] + 1) (nums[i] > nums[j])
- dp2[i]: nums[i]๋ฅผ ์ฒซ ์์๋ก ํ๋ ๊ฐ์ฅ ๊ธด ๊ฐ์ ๋ถ๋ถ ์์ด (LDS).
- dp2[i] = max(dp2[i], dp2[j] + 1) (nums[i] > nums[j])
- ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด ๊ณ์ฐ
- dp1[i] + dp2[i] - 1 (์ค์๊ฐ nums[i]๊ฐ ์ค๋ณต๋๋ฏ๋ก -1
๐ก ์ฝ๋
public class Baekjoon_11054 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
int[] dp1 = new int[n]; // LIS
int[] dp2 = new int[n]; // LDS
for (int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
}
// 1. LIS (์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ)
dp1[0] = 1;
for (int i = 1; i < n; i++) {
for (int j = i - 1; j >= 0; j--) {
if (nums[i] > nums[j]) {
dp1[i] = Math.max(dp1[i], dp1[j] + 1);
}
}
}
// 1. LDS (์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ)
dp2[n - 1] = 1;
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
if (nums[i] > nums[j]) {
dp2[i] = Math.max(dp2[i], dp2[j] + 1);
}
}
}
// 3. ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด ๊ธธ์ด ๊ณ์ฐ
int ans = 0;
for (int i = 0; i < n; i++) {
int cnt = dp1[i] + dp2[i];
ans = Math.max(ans, cnt);
}
System.out.println(ans - 1); // ์ค์๊ฐ์ ๊ฒน์น๋ฏ๋ก -1
}
}
๐ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- LIS (O(Nยฒ)) + LDS (O(Nยฒ) = O(Nยฒ)
- N โค 1000์ด๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(1,000,000)
'์๊ณ ๋ฆฌ์ฆ(JAVA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2225 "ํฉ๋ถํด" (JAVA) (0) | 2025.02.20 |
---|---|
๋ฐฑ์ค 9251 "LCS (์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)" (JAVA) (0) | 2025.02.19 |
๋ฐฑ์ค 11053 & 11722 "๊ฐ์ฅ ๊ธด ์ฆ๊ฐ/๊ฐ์ ๋ถ๋ถ ์์ด" (JAVA) (0) | 2025.02.18 |
๋ฐฑ์ค 1316 "๊ทธ๋ฃน ๋จ์ด ์ฒด์ปค" (JAVA) (0) | 2025.02.18 |
๋ฐฑ์ค 1003 "ํผ๋ณด๋์น ํจ์" (JAVA) (0) | 2025.02.17 |