๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.10942 ํฐ๋ฆฐ๋๋กฌ? ๋ฌธ์ ํ์ด - java
๐ ๋ฌธ์
https://www.acmicpc.net/problem/10942
๋ช ์ฐ๋ ํ์ค์ด์ ํจ๊ป ํฐ๋ฆฐ๋๋กฌ ๋์ด๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ , ํ์ค์ด๋ ์์ฐ์ N๊ฐ๋ฅผ ์น ํ์ ์ ๋๋ค. ๊ทธ ๋ค์, ๋ช ์ฐ์๊ฒ ์ง๋ฌธ์ ์ด M๋ฒ ํ๋ค.
๊ฐ ์ง๋ฌธ์ ๋ ์ ์ S์ E(1 โค S โค E โค N)๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, S๋ฒ์งธ ์๋ถํฐ E๋ฒ์งธ ๊น์ง ์๊ฐ ํฐ๋ฆฐ๋๋กฌ์ ์ด๋ฃจ๋์ง๋ฅผ ๋ฌผ์ด๋ณด๋ฉฐ,
๋ช ์ฐ๋ ๊ฐ ์ง๋ฌธ์ ๋ํด ํฐ๋ฆฐ๋๋กฌ์ด๋ค ๋๋ ์๋๋ค๋ฅผ ๋งํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ํ์ค์ด๊ฐ ์น ํ์ ์ ์ ์๊ฐ 1, 2, 1, 3, 1, 2, 1๋ผ๊ณ ํ์.
S = 1, E = 3์ธ ๊ฒฝ์ฐ 1, 2, 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค. S = 2, E = 5์ธ ๊ฒฝ์ฐ 2, 1, 3, 1์ ํฐ๋ฆฐ๋๋กฌ์ด ์๋๋ค. S = 3, E = 3์ธ ๊ฒฝ์ฐ 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค. S = 5, E = 7์ธ ๊ฒฝ์ฐ 1, 2, 1์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค. ์์ฐ์ N๊ฐ์ ์ง๋ฌธ M๊ฐ๊ฐ ๋ชจ๋ ์ฃผ์ด์ก์ ๋, ๋ช ์ฐ์ ๋๋ต์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ ์ ๊ทผ๋ฒ
Q.10942 ํฐ๋ฆฐ๋๋กฌ? ๋ฌธ์ ์ ๋๋ค.
์์ฐ์ N๊ฐ๊ฐ ์ฃผ์ด์ง๊ณ
M๋ฒ์ ์ง๋ฌธ์ด ์ฃผ์ด์ง๋๋ฐ
๊ฐ ์ง๋ฌธ๋ง๋ค S๋ถํฐ E๊น์ง์ ์๊ฐ ํฐ๋ฆฐ๋๋กฌ์ธ์ง๋ฅผ ํ์ธํ๋ ๋ฌธ์ ์ ๋๋ค.
์ฒ์์๋ ํฐ๋ฆฐ๋๋กฌ์ ํน์ฑ์ ์ด์ฉํด
๋ฌธ์์ด์ substring์ ์ด์ฉํด S๋ถํฐ E๊น์ง์ ๋ฌธ์์ด์ ๋ง๋ ํ
reverse ํจ์๋ฅผ ์ด์ฉํด ํ์ดํ์์ต๋๋ค.
ํ์ง๋ง ์ฃผ์ด์ง ์ง๋ฌธ์ ๊ฐ์ M์ด ๋๋ฌด ๋ง์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ์ต๋๋ค.
๊ทธ๋์ ๋ค์์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํด ํ์ดํ ์ ์์์ต๋๋ค.
ํฐ๋ฆฐ๋๋กฌ์ S๋ถํฐ E๊น์ง์ ์๊ฐ ๋์นญ์ด ๋๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก S <-> E ์ฌ์ด์ ์ซ์๋ค์ด ํฐ๋ฆฐ๋๋กฌ์ด๊ณ S๋ฒ์งธ ์ E๋ฒ์งธ ์๊ฐ ๊ฐ๋ค๋ฉด ํฐ๋ฆฐ๋๋กฌ์ ๋๋ค.
์ฆ S+1๋ฒ์งธ๋ถํฐ E-1๋ฒ์งธ ์๋ค์ด ํฐ๋ฆฐ๋๋กฌ์ด๊ณ S๋ฒ์งธ ์ E๋ฒ์งธ ์๊ฐ ๊ฐ์ผ๋ฉด ๋ฉ๋๋ค.
if (dp[i+1][j-1] == 1 && numbers[i]==numbers[j]) true => ํฐ๋ฆฐ๋๋กฌ
์์ ๊ท์น์ ์ด์ฉํ๋ฉด ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋จ, S์ E๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ฆ ๊ธธ์ด๊ฐ 1์ธ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ํฐ๋ฆฐ๋๋กฌ์ด๋ฏ๋ก ๋จผ์ ํฐ๋ฆฐ๋๋กฌ์์ ํ์ํด์ฃผ๊ณ
S๋ถํฐ E์ ๊ธธ์ด๊ฐ 2์ผ ๋๋ S๋ฒ์งธ ์์ E๋ฒ์งธ ์๊ฐ ๊ฐ๋ค๋ฉด ํฐ๋ฆฐ๋๋กฌ์์ ํ์ํด์ค๋๋ค.
๊ทธ ์ดํ
๊ธธ์ด๊ฐ 3์ธ ๊ฒฝ์ฐ๋ถํฐ ์์ ๊ท์น์ ์ด์ฉํด
๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๐ป ์ฝ๋
1. String reverse๋ฅผ ์ด์ฉํ ํ์ด (์๊ฐ์ด๊ณผ)
package problem.dynamic.Q10942;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_10942_1 {
static String palindrome;
static int n,m;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
input();
System.out.println(sb.toString());
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
palindrome = br.readLine().replaceAll(" ","");
m = Integer.parseInt(br.readLine());
for(int i=0; i<m; i++){
String temp[] = br.readLine().split(" ");
int start = Integer.parseInt(temp[0]);
int end = Integer.parseInt(temp[1]);
if(end-start+1 == 2){
sb.append(0);
sb.append("\n");
continue;
}
String subString = palindrome.substring(start-1,end);
if (isPalindrome(subString) ){
sb.append(1);
}
else
sb.append(0);
sb.append("\n");
}
br.close();
}
private static boolean isPalindrome(String str) {
String reverseStr = new StringBuilder(str).reverse().toString();
if (str.equals(reverseStr))
return true;
else
return false;
}
}
2. ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ ํ์ด (์ ๋ต)
package problem.dynamic.Q10942;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_10942_2 {
static int[] numbers;
static int dp[][];
static int n,m;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
input();
System.out.println(sb.toString());
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
String palindrome[] = br.readLine().split(" ");
numbers = new int[n+1];
dp = new int[n+1][n+1];
for(int i=1; i<=n; i++){
numbers[i] = Integer.parseInt(palindrome[i-1]);
}
solve();
m = Integer.parseInt(br.readLine());
for(int i=0; i<m; i++){
String temp[] = br.readLine().split(" ");
int start = Integer.parseInt(temp[0]);
int end = Integer.parseInt(temp[1]);
sb.append(dp[start][end]+"\n");
}
br.close();
}
private static void solve() {
for (int i = 1; i <= n; i++) {
dp[i][i] = 1;
}
for (int i = 1; i <= n - 1; i++) {
if (numbers[i] == numbers[i + 1]) {
dp[i][i + 1] = 1;
} else {
dp[i][i + 1] = 0;
}
}
for (int j = 3; j <= n; j++) {
for (int i = 1; i <= j; i++) {
if (dp[i][j] == 1 || j - i == 1) {
continue;
}
if (dp[i + 1][j - 1] == 1 && numbers[i] == numbers[j]) {
dp[i][j] = 1;
}
}
}
}
}