문제
앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 합니다.
문자열이 입력되면 해당 문자열이 회문 문자열이면 "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()라는 함수를 사용하면 대소문자를 구분하지 않고 비교할 수 있다.
이전에 썼던 방법들을 비슷하게 사용하여 문제를 풀었다.
'문제 풀이 > 인프런' 카테고리의 다른 글
[JAVA11/알고리즘]1-10 가장 짧은 문자거리 (1) | 2022.08.04 |
---|---|
[JAVA11/알고리즘]1-8 유효한 팰린드롬 (0) | 2022.08.04 |
[JAVA11/알고리즘]1-6 중복 문자 제거 (0) | 2022.08.02 |
[JAVA11/알고리즘] 1-5 특정 문자 뒤집기 (1) | 2022.07.31 |
[Java11/알고리즘] 1-4 단어 뒤집기 (0) | 2022.07.31 |