카테고리 없음

[문자열] 회문 문자열 .java

머밍 2024. 9. 8. 12:08

설명

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 합니다.

문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력하는 프로그램을 작성하세요.

단 회문을 검사할 때 대소문자를 구분하지 않습니다.

입력

첫 줄에 길이 100을 넘지 않는 공백이 없는 문자열이 주어집니다.

출력

첫 번째 줄에 회문 문자열인지의 결과를 YES 또는 NO로 출력합니다.

예시 입력 1 

gooG

예시 출력 1

YES

 

 

내 풀이

  • 대소문자 구분하지 않음 -> 다 소문자로 바꾸기
  • rt, lt를 두어 하나씩 이동하며 비교함

 

여러 회문 문제들을 풀어서 그런지 쉽게 풀 수 있었다

import java.util.Scanner;
  
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        String word = sc.nextLine();
        word = word.toLowerCase();//소문자로 바꾸기

        int start = 0;
        int end = word.length()-1;
        char[] chars = word.toCharArray();//문자열-> 배열
        while(start < end){
            if(chars[start] != chars[end]){//하나라도 다르면
                System.out.println("NO");
            }
            //하나씩 이동
            start++;
            end--;
        }
        System.out.println("YES");
    }
}

 

같은 풀이 방식 - 함수로 구현

import java.util.Scanner;
  
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String word = sc.nextLine();
        word = word.toLowerCase();//소문자로 변환
        
        if(isPalindrome(word)){
            System.out.println("YES");
        } else{
            System.out.println("NO");
        }
    }
    //회문 판별 함수
    public static boolean isPalindrome(String word){
        int start = 0;
        int end = word.length()-1;
        char[] chars = word.toCharArray();
        
        while(start < end){
            if(chars[start] != chars[end]){
                return false;
            }
            start++;
            end--;
        }
        return true;
    
    }
}

 

 

다른 풀이 - 직접 검사 (인덱스로)

인덱스로 검사할땐, 문자열 개수의 반만 돌면 됨

 즉 i는 0부터 앞에서 뒤로 검사 시작하고 len-i-1의 인덱스를 사용하여 끝에서 앞으로 검사

import java.util.Scanner;

public class Main {
    public String solution(String str){
        int len = str.length();//문자열 길이
        str = str.toLowerCase();//소문자로

        for(int i=0;i<len/2;i++){//문자열 길이 반만큼(몫만큼 검사)
            //시작 인덱스 값과 끝 인덱스 값을 비교
            if(str.charAt(i) != str.charAt(len-1-i)){
                return "NO";//하나라도 틀리면 회문이 아님
            }
        }
        return "YES";
    }
    public static void main(String[] args){
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(T.solution(str));

    }
}

 

다른 풀이 - equalsIgnoreCase

  1. 입력 받은 str을 거꾸로 정렬한 문자열을 만든다 -> StringBuilder의 reverse() 이용
  2. 거꾸로 된 문자열과 str을 비교한다 -> equalsIgnoreCase() 를 이용해 대소문자와 관련없이 문자열이 같은지 판별한다
import java.util.Scanner;

public class Main {
    public String solution(String str){
        int len = str.length();//문자열 길이
        String tmp = new StringBuilder(str).reverse().toString();//str을 뒤집어 저장

        if(!str.equalsIgnoreCase(tmp)) return "NO";
        return "YES";
    }
    public static void main(String[] args){
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(T.solution(str));

    }
}

 

 

💡

두 개의 포인터로 구하는 것이 아니라 인덱스나 다른 함수를 통해 구할 수 있음을 알았다