본문 바로가기

문제 풀이/인프런

[JAVA11/알고리즘]1-7 회문 문자열

문제

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

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

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


입력

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


출력 

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


예시 입력 1 

gooG


예시 출력 1

 

YES


 

 



해결

두가지 방법으로 해결해 보았다.

 

1. StringBuilder 의 reverse() 사용하기 

먼저, 입력받은 문자열을 StringBuilder로 만들어준다.

그 StringBuilder를 reverse()를 이용하여 뒤집어준다.

그 뒤집힌 문자열과  원래 문자열이 같으면 회문 문자열인 것이다.

String.equalsIgnoreCase()를 이용하면 파라미터로 받은 문자열과 대소문자를 구분하지 않고 문자열이 동일한지 확인할 수 있다. 


 2.

설명을 돕기위해 사진을 첨부했지만... 조잡한 점 양해 부탁드립니다..

 

위 그림에서 문자열 gooG를 문자대로 잘랐다.

위 문자열이 회문 문자열이려면 반으로 잘라서 중앙을 기준으로 데칼코마니처럼 양 쪽 문자가 동일하면 된다.

 

그림으로 표현해보았다. 위 문자열에서는 Index 0과 3의 문자가 같고 1과 2의 문자가 같다.

public static String solution(String str){
        String answer ="YES";
        str = str.toLowerCase();
        int len = str.length();
        for(int i=0; i<len/2;i++){
            if(str.charAt(i)!=str.charAt(len-i-1)) return "NO";
        }
        return answer;

회문문자열이면 YES를, 아니면 NO를 리턴해주는 메소드를 구현해보았다.

여기서 주요부분은 for문이다.

비교작업을 문자열의 길이의 딱 절반만 해주면된다.

if문에서 i번째 인덱스와 len-i-1 인덱스의 문자가 같지않으면 NO를 리턴해준다.

if문에 걸리지 않으면 그 문자열이 회문문자열이므로 그대로 YES를 리턴해준다.

 

물론!! 대소문자를 구분하지 않으므로 문자를 toLowerCase()를 이용하여 대소문자 구분하지 않게 만들어줘야한다.

toUpperCase()를 사용해도 당연히 된다.



CODE
 

import java.util.*;

public class Main {
    public static void solution(String str){
        StringBuilder sb = new StringBuilder(str);
        if(sb.toString().equalsIgnoreCase(sb.reverse().toString()))
            System.out.println("YES");
        else
            System.out.println("NO");
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        solution(str);
    }
}
import java.util.*;

public class Main {
    public static String solution(String str){
        String answer ="YES";
        str = str.toLowerCase();
        int len = str.length();
        for(int i=0; i<len/2;i++){
            if(str.charAt(i)!=str.charAt(len-i-1)) return "NO";
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        System.out.println(solution(str));
    }
}


 

 


결과

 

equalIgnoreCase()라는 함수를 사용하면 대소문자를 구분하지 않고 비교할 수 있다.

이전에 썼던 방법들을 비슷하게 사용하여 문제를 풀었다.