골드 4
구현 방법
투포인터 이용해서 풀었다. 하지만 질문마다 팰린드롬을 구하면 겹치는 구간에 대한 질문마다 다시 투포인터를 돌려야해서 느릴거라고 예상했다.
그리고 역시 예상이 맞았다.
자 그럼 어떻게 풀면 중복 구간이 해결될까?
당연히 구했던 구간을 기억하고 있으면 된다!
그럼 뭘 해야한다? 바로 다이나믹프로그래밍!!
먼저 시작 인덱스, 끝 인덱스를 각각 행,열로 가지는 이차원 배열을 생성한다.
먼저 길이가 1인 경우, 무조건 팰린드롬이다.
길이가 2인 경우, 두 인덱스의 숫자가 같으면 팰린드롬이다.
길이가 3 이상인 경우, 시작과 끝 인덱스가 같고, (시작 + 1)과 (끝 - 1) 범위가 팰린드롬인 경우 팰린드롬이다.
코드
DP 방식
import java.io.*;
import java.util.*;
/**
* 백준 10942
* 팰린드롬?
* 골드 4
* https://www.acmicpc.net/problem/10942
*/
public class Boj10942 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int[] nums = new int[N + 1];
for(int i = 1; i <= N; i++)
nums[i] = Integer.parseInt(st.nextToken());
boolean[][] dp = new boolean[N + 1][N + 1];
//길이 1인 팰린드롬
for(int i = 1; i <= N; i++)
dp[i][i] = true;
//길이 2인 팰린드롬
for(int i = 1; i < N; i++) {
if(nums[i] == nums[i + 1])
dp[i][i + 1] = true;
}
//길이 3이상 팰린드롬
for(int l = 2; l <= N; l++) {
for(int i = 1; i <= N - l + 1; i++) {
int j = i + l - 1;
if(nums[i] == nums[j] && dp[i + 1][j - 1])
dp[i][j] = true;
}
}
int M = Integer.parseInt(br.readLine());
while(M-- > 0) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
if(dp[s][e])
sb.append(1);
else
sb.append(0);
sb.append("\n");
}
System.out.print(sb);
}
}
투포인터 방식
import java.io.*;
import java.util.*;
/**
* 백준 10942
* 팰린드롬?
* 골드 4
* https://www.acmicpc.net/problem/10942
*/
public class Boj10942 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int[] nums = new int[N];
for(int i = 0; i < N; i++)
nums[i] = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(br.readLine());
while(M-- > 0) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken()) - 1;
int e = Integer.parseInt(st.nextToken()) - 1;
int answer = 1;
while(s <= e) {
if(nums[s] != nums[e]) {
answer = 0;
break;
} else {
s++;
e--;
}
}
sb.append(answer).append("\n");
}
System.out.print(sb);
}
}
'알고리즘' 카테고리의 다른 글
자바 - 백준 1509 / 팰린드롬 분할 (0) | 2024.09.30 |
---|---|
자바 - 백준 2473 / 세 용액 (2) | 2024.09.28 |
자바 - 백준 2212 / 센서 (0) | 2024.09.22 |
자바 - 백준 16974 / 레벨 햄버거 (1) | 2024.09.20 |
자바 - 백준 1644/ 소수의 연속합 (3) | 2024.09.16 |