-
[BOJ]10942_팰린드롬_Java알고리즘문제풀이/백준 2021. 7. 29. 21:15
--문제--
https://www.acmicpc.net/problem/10942
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
--문제 접근--
팰린드롬의 정의:회문 또는 팰린드롬은 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열 등이
팰린드롬은 로꾸거 인걸로 이해하고 문제를 풀어봤습니다.
맨 처음은 1차원적으로 S와 E가 주어질 때 첫 번째 항과 마지막항과 비교해가면서 같지 않을 때는 팰린드롬이 되지 않는다고 판단하고 문제를 풀어봤을 때 바로 풀어졌지만 이문제의 의도는 아닌 거 같아 조금 더 생각을 해봤습니다.
생각을 하다가 풀지 못하여 검색을 하면서 아이디어를 유추했습니다.
12321 일 때 1 5가 팰린드롬이 되어야 한다면 2 4 도 팰린드롬이 차례대로 다되어야 한다는 점에서 착안하였습니다.
그래서 생각한 점화식이
for(int i=2;i<=N;i++) { for(int j=1;i+j<=N;j++) { if(arr[j]==arr[i+j]&&dy[j+1][i+j-1])dy[j][i+j]=true; } }
입니다.
기본적인 흐름은
i가 2일 때 길이는 3이므로
1 2 3 2 1
1 2 3 2 1
1 2 3 2 1
i가 3이고 길이가 4일 때
1 2 3 2 1
1 2 3 2 1
이렇게 검사를 차근차근해가면서 답을 구해가는 형식입니다.
`
package Class5; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_10942_팰린드롬 { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int N=Integer.parseInt(br.readLine()); StringTokenizer st=null; st=new StringTokenizer(br.readLine()); int[] arr=new int[N+1]; for(int i=1;i<=N;i++) { arr[i]=Integer.parseInt(st.nextToken()); } int TC=Integer.parseInt(br.readLine()); StringBuilder sb=new StringBuilder(); for(int t=0;t<TC;t++) { st=new StringTokenizer(br.readLine()); int start=Integer.parseInt(st.nextToken()); int end=Integer.parseInt(st.nextToken()); int ans=1; while(start<end) { if(arr[start]!=arr[end]) { ans=0; break; } start++; end--; } sb.append(ans+"\n"); } System.out.println(sb); } }
다이나믹
package Class5; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_10942_팰린드롬 { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int N=Integer.parseInt(br.readLine()); StringTokenizer st=null; st=new StringTokenizer(br.readLine()); int[] arr=new int[N+1]; for(int i=1;i<=N;i++) { arr[i]=Integer.parseInt(st.nextToken()); } boolean[][] dy=new boolean[N+1][N+1]; for(int i=1;i<=N;i++) { dy[i][i]=true; } for(int i=1;i<N;i++) { if(arr[i]==arr[i+1])dy[i][i+1]=true; } for(int i=2;i<=N;i++) { for(int j=1;i+j<=N;j++) { if(arr[j]==arr[i+j]&&dy[j+1][i+j-1])dy[j][i+j]=true; } } int TC=Integer.parseInt(br.readLine()); StringBuilder sb=new StringBuilder(); for(int t=0;t<TC;t++) { st=new StringTokenizer(br.readLine()); int start=Integer.parseInt(st.nextToken()); int end=Integer.parseInt(st.nextToken()); if(dy[start][end])sb.append(1+"\n"); else sb.append(0+"\n"); } System.out.println(sb); } }
'알고리즘문제풀이 > 백준' 카테고리의 다른 글
[BOJ]3460_이진수_Java (0) 2021.09.24 [BOJ]2501_JAVA_약수구하기 (0) 2021.09.20 [BOJ]9466_팀프로젝트_Java (0) 2021.07.24 [BOJ]9252_LCS2_Java (0) 2021.07.21 [BOJ]2473_세용액_Java (0) 2021.07.11