์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์๋ฃจ์
- Flutter
- Java
- ํ์ด์ฝ ์ถ์ฒ์ธ
- php
- ํ์ด์ฌ
- ํ์ด์ฝ ์น๊ตฌ์ฝ๋
- ํ์ด์ฝ ์ด๋์ฝ๋
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์์
- ์ต๋จ ๊ฒฝ๋ก
- JAVA SPRING
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ 3ํ
- ์๋ฐ ์คํ๋ง
- SWEA
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ๋ฌธ์ ํ์ด
- programmers
- C
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์ฐ์ต๋ฌธ์
- ๋ฐฐ์ด
- ํ๋ฌํฐ
- ํ์ด์ฝ ์ถ์ฒ์ธ์ฝ๋
- spring
- ์๋ฐ
- ๋ฐฑ์ค
- php ํ๋ก๊ทธ๋๋ฐ
- C์ธ์ด
- ์คํ๋ง
- ํ๋ฌํฐ ๊ฐ๋ฐํ๊ฒฝ ์ค์
- ํ์ ๋ถ๊ธฐ
- Today
- Total
ImJay
[BOJ/Java] 10942. ํฐ๋ฆฐ๋๋กฌ? ๋ณธ๋ฌธ
๐ [BOJ/Java] 10942. ํฐ๋ฆฐ๋๋กฌ?
๐ ๋ฌธ์ ๋งํฌ: ๋ฐฑ์ค 10942๋ฒ - ํฐ๋ฆฐ๋๋กฌ?
๐ ๋ฌธ์ ํด์
๐ข ์ฃผ์ด์ง ์์ด์์ ํน์ ๊ตฌ๊ฐ์ด ํฐ๋ฆฐ๋๋กฌ์ธ์ง ํ๋ณํ๋ ๋ฌธ์ ์ด๋ค.
๐ ๏ธ ํฐ๋ฆฐ๋๋กฌ(Palindrome): ์์์ ์ฝ์ด๋ ๋ค์์ ์ฝ์ด๋ ๊ฐ์ ๋ฌธ์์ด or ์์ด
โ ์ฌ๋ฌ ๊ฐ์ ์ง๋ฌธ(๊ตฌ๊ฐ)์ด ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ๊ตฌ๊ฐ์ด ํฐ๋ฆฐ๋๋กฌ์ธ์ง ๋น ๋ฅด๊ฒ ํ๋จํด์ผ ํ๋ค.
โ ํต์ฌ ๊ฐ๋
- ๋จ์ํ๊ฒ ๋งค๋ฒ ํ์ธํ๋ฉด O(N) ์ฐ์ฐ์ด ํ์ํ๋ฏ๋ก ๋นํจ์จ์
- DP(๋์ ๊ณํ๋ฒ) ํ์ฉํ์ฌ ์ค๋ณต ๊ณ์ฐ ์ต์ํ
- ๊ตฌ๊ฐ ํ๋ณ ๋ฌธ์ ์ด๋ฏ๋ก "๊ตฌ๊ฐ DP"๋ก ์ ๊ทผ
๐ ๏ธ ํ์ด ๊ณผ์
1๏ธโฃ ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฐ ์ด๊ธฐํ
- N๊ฐ์ ์ซ์๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด์ ์ ์ฅ
- dp[i][j]๋ฅผ ์ฌ์ฉํ์ฌ i๋ถํฐ j๊น์ง์ ๊ตฌ๊ฐ์ด ํฐ๋ฆฐ๋๋กฌ์ธ์ง ์ ์ฅ
2๏ธโฃ DP ํ ์ด๋ธ ์ฑ์ฐ๊ธฐ
- dp[i][i] = true (๊ธธ์ด 1์ง๋ฆฌ ๊ตฌ๊ฐ์ ํญ์ ํฐ๋ฆฐ๋๋กฌ)
- dp[i][i+1] = (arr[i] == arr[i+1]) (๊ธธ์ด 2์ง๋ฆฌ ๊ตฌ๊ฐ์ ๋ ์ซ์๊ฐ ๊ฐ์ผ๋ฉด ํฐ๋ฆฐ๋๋กฌ)
- ๊ธธ์ด๊ฐ 3 ์ด์์ผ ๋:
dp[i][j] = (arr[i] == arr[j]) && dp[i+1][j-1]
3๏ธโฃ ์ง๋ฌธ์ ๋น ๋ฅด๊ฒ ๋ตํ๊ธฐ
- dp[s][e] ๊ฐ์ ๋ฐ๋ก ์ถ๋ ฅํ์ฌ O(1) ์๊ฐ ๋ณต์ก๋๋ก ํ๋ณ
๐ป ์ฝ๋ ๊ตฌํ (Java)
import java.util.*;
public class Main {
static int N, M;
static int[] arr;
static boolean[][] dp;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
arr = new int[N + 1]; // 1-based index
dp = new boolean[N + 1][N + 1];
for (int i = 1; i <= N; i++) {
arr[i] = sc.nextInt();
}
preprocess(); // DP ํ
์ด๋ธ ๋ฏธ๋ฆฌ ์ฑ์ฐ๊ธฐ
M = sc.nextInt();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M; i++) {
int s = sc.nextInt();
int e = sc.nextInt();
sb.append(dp[s][e] ? "1\n" : "0\n");
}
System.out.print(sb);
}
public static void preprocess() {
// ๊ธธ์ด 1์ธ ๊ตฌ๊ฐ (ํญ์ ํฐ๋ฆฐ๋๋กฌ)
for (int i = 1; i <= N; i++) {
dp[i][i] = true;
}
// ๊ธธ์ด 2์ธ ๊ตฌ๊ฐ
for (int i = 1; i < N; i++) {
if (arr[i] == arr[i + 1]) {
dp[i][i + 1] = true;
}
}
// ๊ธธ์ด 3 ์ด์์ธ ๊ตฌ๊ฐ
for (int len = 3; len <= N; len++) { // ๋ถ๋ถ ๋ฌธ์์ด ๊ธธ์ด
for (int i = 1; i + len - 1 <= N; i++) { // ์์ ์ธ๋ฑ์ค
int j = i + len - 1; // ๋ ์ธ๋ฑ์ค
if (arr[i] == arr[j] && dp[i + 1][j - 1]) {
dp[i][j] = true;
}
}
}
}
}
โฑ๏ธ ์๊ฐ ๋ณต์ก๋ ๋ถ์
๐ O(N² + M) (์ต๋ 2500² + 10โถ ≈ 625๋ง ์ฐ์ฐ)
๐ก DP ํ
์ด๋ธ ์ฑ์ฐ๊ธฐ → O(N²)
๐ก ๊ฐ ์ง์ ์ฒ๋ฆฌ → O(1) (์ด O(M))
๐ฅ N ≤ 2000์ด๋ฏ๋ก ์ถฉ๋ถํ ํด๊ฒฐ ๊ฐ๋ฅ
๐ก ๋๋์
โ
๊ตฌ๊ฐ DP๋ฅผ ํ์ฉํ๋ ์ข์ ๋ฌธ์
โ
๋งค๋ฒ ์ง์ ํฐ๋ฆฐ๋๋กฌ์ ๊ฒ์ฌํ๋ฉด O(N)์ฉ ๊ฑธ๋ฆฌ์ง๋ง, DP๋ฅผ ์ด์ฉํด O(1)๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
โ
๋ฌธ์์ด์ด๋ ์์ด์ "๊ตฌ๊ฐ ๋ฌธ์ "๋ DP ํ์ฉ ๊ฐ๋ฅ์ฑ์ ํญ์ ๊ณ ๋ฏผํด๋ด์ผ ํ๋ค! ๐
'์๊ณ ๋ฆฌ์ฆ > BOJ - Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/Java] 9370. ๋ฏธํ์ธ ๋์ฐฉ์ง (0) | 2025.03.10 |
---|---|
[BOJ/Java] 1039. ๊ตํ (0) | 2025.03.10 |
[BOJ/Java] 7579. ์ฑ (0) | 2025.03.10 |
[BOJ/Java] 4991. ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2025.03.10 |
[BOJ/Java] 11049. ํ๋ ฌ ๊ณฑ์ ์์ (0) | 2025.03.10 |