카테고리 없음
[문자열] 회문 문자열 .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
- 입력 받은 str을 거꾸로 정렬한 문자열을 만든다 -> StringBuilder의 reverse() 이용
- 거꾸로 된 문자열과 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));
}
}
💡
두 개의 포인터로 구하는 것이 아니라 인덱스나 다른 함수를 통해 구할 수 있음을 알았다