앞서 팰린드롬 여부를 파악했던 DP문제를 풀었다면, 이번에는 팰린드롬을 만드는 알고리즘을
구현해보겠습니다.
만약 입력한 내용이 이미 팰린드롬 형태라면 해당 입력된 문자열의 길이가
출력될 것이며, 팰린드롬이 아닌 경우에는, 입력한 내용이 팰린드롬이 될 경우 얼마 만큼의
문자열의 길이가 정의되는지 출력될 것입니다.
코드는 상당히 짧기 때문에 먼저 전체 코드를 보여주고 설명하도록 하겠습니다.
package algorithm;
import java.util.Scanner;
public class ThePalindrome {
private static Scanner scanner;
private static String s;
public static void main(String[] args) {
// TODO Auto-generated method stub
scanner = new Scanner(System.in);
s = scanner.nextLine().trim();
System.out.print(find(s));
}
public static int find(String str) {
for (int i = str.length();; i++) {
boolean flag = true;
for (int j = 0; j < str.length(); j++) {
if ((i - j - 1) < str.length() && str.charAt(j) != str.charAt(i - j - 1)) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
}
}
첫 반복문에서는 입력되는 문자열의 길이부터 값을 시작합니다.
두 번째 반복문을 확인할 경우 왜 첫 반복문에서 문자열의 길이부터 값을 시작하는지 알 수 있습니다.
우선 문자열의 길이나 배열의 길이, 미로 문제 등 무언가 이동하는 문제일 경우에는 반드시
돌아다닐 수 있는 범위 내에서 진행되어야 합니다.
if ((i - j - 1) < str.length() && str.charAt(j) != str.charAt(i - j - 1))
따라서 (i-j-1) < str.length()라는 조건을 둔 것입니다.
이 후 에는 j값에 대한 문자열의 위치(char)에 대한 값과 문자열의 마지막 위치에 대한 값을 비교합니다.
같지 않을 경우 팰린드롬이 아니라고 판단하여 flag는 false를 주고 안 쪽 반복문을 벗어납니다.
이렇게 여러 번의 과정을 거친 다음에 팰린드롬이 계속해서 아닐 경우라면 문자열의 마지막 값에서
반복문이 모두 종료되면서 위치 값인 i가 출력될 것입니다.
그 말인 즉, 해당 문자열 만큼 팰린드롬을 만들기 위해서 인덱스(i) 값이 커졌다는 걸 반증합니다.
예를 들어, ABCDE 라는 문자열을 입력했다고 가정해봅시다.
그럴 경우, 안 쪽 반복문이 break를 반복하면서 i 값은 계속해서 증가할 것이고, 결국 E를 남겨두고
flag는 true 값을 갖고 해당 위치인 i 값이 출력될 것입니다.
이는 직접적으로 팰린드롬을 만드는 것은 아니지만, ABCDE가 팰린드롬이 되기 위해서는
ABCDE(DCBA) 이렇게 4개의 수를 추가해줘서 총 9라는 자릿값이 반환될 것임을 알 수 있습니다.
만일 입력 값이 팰린드롬일 경우 처음부터 flag가 true가 될 것이기 때문에 바로 해당 입력 값의
문자열의 길이가 반환될 것입니다.
감사합니다.
'Algorithm' 카테고리의 다른 글
카카오 예비 코딩테스트 2번 (1) | 2018.08.03 |
---|---|
BOJ_11066_파일합치기 (0) | 2018.07.29 |
BOJ_10942_팰린드롬? (0) | 2018.07.27 |
BOJ_2294_동전2 (0) | 2018.07.27 |
BOJ_1로만들기_1463 (0) | 2018.07.20 |