https://www.acmicpc.net/problem/1254
코드설명
문자열(String) + 브루트포스(BruteForce) 를 활용합니다.
기본적인 아이디어는 주어진 문자열을 S라고 합시다.
그리고 팰린드롬을 체크하기 위하여 SReversed 라는 S를 뒤집은 문자열을 하나 생성합니다.
그리고 이 S와 SReversed를 비교하면 됩니다.
물론, 이때 이 S의 접미사와 SReversed의 접두사가 일치할떄 팰린드롬이 만들어지므로 Index를 잘 구현해서 처리해야겠지요.
코드
정답코드1입니다. 가장 단순한 문자열 검색 알고리즘이라고 할 수 있지요. 단어 S의 접미사에서 팰린드롬의 접두사를 찾는 과정이 검색입니다.
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
static int answer = 50 * 2;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer st = new StringTokenizer(br.readLine());
String s = br.readLine();
sb = new StringBuilder(s);
String sReversed = sb.reverse().toString();
for(int begin = 0; begin < s.length(); begin++) {
int matched = 0;
for(int sRBegin = 0; sRBegin + begin < sReversed.length(); sRBegin ++) {
if(s.charAt(begin + sRBegin) == sReversed.charAt(sRBegin)) {
matched++;
} else {
matched = 0;
break;
}
}
answer = Math.min(answer, s.length() * 2 - matched);
}
System.out.println(answer);
}
}
정답코드2입니다. 이 코드는 정답코드1과 거의 같지만 비교하는 부분에서 로직이 살짝 다릅니다.
다른점은 begin + sRBegin 과 같이 Index를 처리하는 대신에 Substring해서 처리하는데요, 당연히 첫번쨰 코드가 더 효율적입니다.
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
static int answer = 50 * 2;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer st = new StringTokenizer(br.readLine());
String s = br.readLine();
sb = new StringBuilder(s);
String sReversed = sb.reverse().toString();
for(int begin = 0; begin < s.length(); begin++) {
String sSub = s.substring(begin); //변경된 부분
int matched = 0;
for(int sRBegin = 0; sRBegin + begin < sReversed.length(); sRBegin ++) {
if(sSub.charAt(sRBegin) == sReversed.charAt(sRBegin)) { //변경된 부분.
matched++;
} else {
matched = 0;
break;
}
}
answer = Math.min(answer, s.length() * 2 - matched);
}
System.out.println(answer);
}
}
'알고리즘 > Shortest Path' 카테고리의 다른 글
[백준] 18352 특정 거리의 도시 찾기 - 다익스트라(Dijkstra) + BFS(너비우선탐색) JAVA (0) | 2023.12.29 |
---|---|
[백준] 14938 서강그라운드 - 다익스트라(Dijkstra) JAVA (0) | 2023.08.31 |
[백준] 1753 최단경로 - 다익스트라(Dijkstra) JAVA (0) | 2023.08.28 |
[백준] 1504 특정한 최단 경로 - 다익스트라(Dijkstra) JAVA (0) | 2023.08.27 |
[백준] 1238 파티 - 다익스트라(Dijkstra) JAVA (0) | 2023.08.12 |