Skip to content

Commit 4d1fe61

Browse files
committed
nsun9505 solved BOJ10942
1 parent 1eb67a6 commit 4d1fe61

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import java.io.*;
2+
import java.util.StringTokenizer;
3+
4+
public class Main {
5+
static int[][] map;
6+
public static void main(String[] args) throws IOException {
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
9+
StringBuilder sb = new StringBuilder();
10+
11+
int N = Integer.parseInt(br.readLine());
12+
map = new int[N+1][N+1];
13+
StringTokenizer st = new StringTokenizer(br.readLine());
14+
for(int i=1; i<=N; i++)
15+
map[0][i] = Integer.parseInt(st.nextToken());
16+
17+
for(int i=1; i<=N; i++)
18+
for(int j=i; j<=N; j++)
19+
map[i][j] = isPalindrome(i, j);
20+
21+
int M = Integer.parseInt(br.readLine());
22+
for(int i=0; i<M; i++){
23+
st = new StringTokenizer(br.readLine());
24+
int s = Integer.parseInt(st.nextToken());
25+
int e = Integer.parseInt(st.nextToken());
26+
27+
sb.append(map[s][e] + "\n");
28+
}
29+
30+
bw.write(sb.toString());
31+
bw.flush();
32+
bw.close();
33+
br.close();
34+
}
35+
36+
public static int isPalindrome(int start, int end){
37+
int len = (end - start + 1)/2;
38+
if(len % 2 == 1)
39+
len++;
40+
for(int i=0; i<len; i++){
41+
if(map[0][start++] != map[0][end--])
42+
return 0;
43+
}
44+
return 1;
45+
}
46+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# [10942] 팰린드롬? - JAVA
2+
3+
## 분류
4+
> 문자열
5+
>
6+
> DP
7+
8+
## 코드
9+
```java
10+
import java.io.*;
11+
import java.util.StringTokenizer;
12+
13+
public class Main {
14+
static int[][] map;
15+
public static void main(String[] args) throws IOException {
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
18+
StringBuilder sb = new StringBuilder();
19+
20+
int N = Integer.parseInt(br.readLine());
21+
map = new int[N+1][N+1];
22+
StringTokenizer st = new StringTokenizer(br.readLine());
23+
for(int i=1; i<=N; i++)
24+
map[0][i] = Integer.parseInt(st.nextToken());
25+
26+
for(int i=1; i<=N; i++)
27+
for(int j=i; j<=N; j++)
28+
map[i][j] = isPalindrome(i, j);
29+
30+
int M = Integer.parseInt(br.readLine());
31+
for(int i=0; i<M; i++){
32+
st = new StringTokenizer(br.readLine());
33+
int s = Integer.parseInt(st.nextToken());
34+
int e = Integer.parseInt(st.nextToken());
35+
36+
sb.append(map[s][e] + "\n");
37+
}
38+
39+
bw.write(sb.toString());
40+
bw.flush();
41+
bw.close();
42+
br.close();
43+
}
44+
45+
public static int isPalindrome(int start, int end){
46+
int len = (end - start + 1)/2;
47+
if(len % 2 == 1)
48+
len++;
49+
for(int i=0; i<len; i++){
50+
if(map[0][start++] != map[0][end--])
51+
return 0;
52+
}
53+
return 1;
54+
}
55+
}
56+
```
57+
58+
## 문제 풀이
59+
주어진 문자에 대해서 모든 질문을 구하기 위해서 2차원 배열을 사용합니다.
60+
61+
2차원 배열 (i, j) 위치의 값은 start가 i이고 j가 end일 때의 부분 문자열이 팰린드롬인지를 알려줍니다.
62+
63+
주어진 문자의 길이는 2000이고 이차원 배열의 절반만 사용(s <= e 이므로)하니깐 미리 질문에 대한 모든 경우의 수를 계산한다면
64+
65+
시간 복잡도 안에 들어온다고 생각했습니다.
66+
67+
그래서 (i, j)에 대해 팰린드롬을 검사하고 팰린드롬이면 1, 아니면 0으로 map을 세팅했습니다.
68+
69+
M만큼 주어진 질문에 대해서는 바로 map[s][e]로 답을 찍어냈습니다.
70+
71+
## 후기
72+
문제를 풀고 보니 DP라고 나와있었습니다..
73+
74+
DP로 어케 풀어야 하는거지..
75+
76+
오늘도 파이팅!

0 commit comments

Comments
 (0)