- 오늘의 학습 키워드 : 투포인터
[문제 이름 : 회문 (백준 17609, G5)]
문제 url : https://www.acmicpc.net/problem/17609
내가 작성한 코드는 아래와 같다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
String input = br.readLine();
sb.append(palindrome(input)).append("\n");
}
sb.deleteCharAt(sb.length()-1);
System.out.print(sb);
}
static int palindrome(String input) {
int left = 0;
int right = input.length() - 1;
// 1. 회문 확인
while (left < right) {
if (input.charAt(left) == input.charAt(right)) {
left++;
right--;
} else {
// 2. 유사회문 확인
if (isPalindrome(input, left + 1, right) || isPalindrome(input, left, right - 1)) {
return 1;
} else {
return 2;
}
}
}
return 0;
}
static boolean isPalindrome(String input, int left, int right) {
while (left < right) {
if (input.charAt(left) != input.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
}
풀이 과정(풀이 시간 : 30분)
문제 전에 의도치 않게 힌트를 봐버려서 문제를 빠르게 풀이할 수 있었다.
1. 투포인터를 활용하여 회문인지 확인한다. 회문이라면 0을 리턴한다.
2. 회문이 아닌 경우, 유사회문인지, 일반 문자열인지 확인해야 한다. 이를 위해 isPalindrome() 메서드를 작성하였다.
3. 한 문자를 삭제하는 과정에서, substring()을 사용하다 보니 오류가 발생할 가능성이 있어, 다르게 방법을 생각해보았다. 회문 검색 방식은 그대로 진행하되, 앞 뒤 글자를 다시 확인하는 과정으로 풀이 방안을 떠올렸다.
내일은 은행 인턴 자기소개서를 작성할 예정이다.