[백준] 17609번

찬들이·2022년 8월 15일
0

알고리즘

목록 보기
28/42

문제 17609번

소스코드

import java.io.*;
public class boj17609 {
    public static int solution(String input){
        int left = 0; int right = input.length()-1; int cnt =0;
        while(left<= right){
            if(input.charAt(left)== input.charAt(right)){
                left++; right--;
            }else{
                cnt =1;
                int l = left +1; int r = right;
                while(l<=r){
                    if(input.charAt(l) == input.charAt(r)){
                        l++; r--;
                    }else{
                        cnt++;
                        break;
                    }
                }
                l = left; r = right-1;
                while(l<=r){
                    if(input.charAt(l) == input.charAt(r)){
                        l++; r--;
                    }else{
                        cnt++;
                        break;
                    }
                }
                if(cnt>=2) return cnt-1;
                else return cnt;
            }
        }
        return cnt;
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < T; i++) {
            sb.append(solution(br.readLine()) +"\n");
        }
        System.out.println(sb);
    }
}

풀이 접근

  1. 전에 회문을 찾는 문제에서는 제귀를 사용 했지만, 이번에는 투 포인터로 풀기로 했다.
  2. left와 right를 문자열의 첫 부분과 끝 부분으로 두고, 유사회문을 위한 cnt 변수도 0으로 초기화한다.
  3. while문을 통해 왼쪽과 오른쪽을 검사하면서 회문인지 검사한다.
  4. 만약 left와 right가 다르다면 cnt를 1로 바꾸고 left에 1을 더한 반복문 한 번, right에 1을 뺀 반복문 한 번을 돌려서 한 곳에서 break가 될 경우에는 cnt =2가 되고 두 곳 다 break가 될 경우에는 cnt=3이 된다.
  5. 2번의 반복문이 끝나고 cnt>=2일 경우 cnt-1 값을 반환한다.
  6. 만약 3번에서 계속 left와 right가 같아서 반복문을 벗어난 경우, 회문으로 판단하여 0을 반환한다.

문제 핵심

  • 투 포인터
  • 문자열
profile
Junior-Backend-Developer

0개의 댓글