(String)회문 문자열/팰린드롬

-·2023년 12월 8일
0

Inflearn-basicTest

목록 보기
4/27

회문 문자열

🗒️String.equals

  • String.equlas(builder 불가.) toString해주고 비교해줘야한다.
  • equalsIgnoreCase를 이용해서 대소문자 구분없이 비교해주자.

** 주의할 것
맨 앞 맨 뒤 인덱스를 비교해주는 경우, str.length()이후 - 1 해주기.
아니면 outofbound exception발생 (당연하지만. 한 번 더 생각할 것)

if(!(str.charAt(i) == str.charAt(str.length()-1-i))) answer = "NO";
* 설명
앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 합니다.
문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면
“NO"를 출력하는 프로그램을 작성하세요.
단, 회문을 검사할 때 대소문자를 구분하지 않습니다.

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

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

StringBuilder.reverse이용

public String solution(String str) {
    String answer = "";
    str = str.toUpperCase(); //equalsIgnoreCase 사용 안할 시
    String strReverse = new StringBuilder(str).reverse().toString();
    if(str.equals(strReverse)) answer = "YES";
    else answer = "NO";
    
    return answer;
}

알고리즘 이용

public String solution(String str){
	String answer = "YES";
    str = str.toUpperCase();
    for(int i = 0; i < str.length()/2; i++){
    	if(!(str.charAt(i) == str.charAt(str.length()-1-i))) return "NO"
       			       // answer ="NO"를 해주지 않아도 바로 NO를 리턴해버리기
    }
}

팰린드롬

  • 💡알게된 점
    equals는 Object의 메소드
    String은 equals메소드가 재정의 되어있어서 내용 비교.
    StringBuilder.equals()는 재정의 x -> 객체가 참조하는 주소값 비교.

🗒️replaceAll("정규표현식", "대체String")

  • 대문자 이외의 값 대체하기 replaceAll("[^A-Z]", "");
  • 영문자 이외의 값 대체하기 replaceAll("[^a-zA-Z]", "");
  • replace('ch', '대체ch'); //정규표현식x char o
* 설명

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 
작성하세요.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.
알파벳 이외의 문자들의 무시합니다.

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

* 출력
첫 번째 줄에 팰린드롬인지의 결과를 YES 또는 NO로 출력합니다.

나의 풀이
StringBuilder객체를 만든 후 isAlphabetic를 이용해, 맞으면 추가해준 후 reverse()를 통해 비교.
다만 주의할 점은, StringBuilder에는 문자열의 내용을 직접 비교하는 메소드를 제공하지 않기때문에 toString으로 바꿔준 후, 재정의 되어있는 String method를 사용한다.

public String solution(String str) {
    String answer = "";
    StringBuilder strbd = new StringBuilder();

    for(int i = 0; i < str.length(); i++){

        if(Character.isAlphabetic(str.charAt(i))){

            strbd.append(str.charAt(i));
        }
    }
    if(strbd.toString().equalsIgnoreCase((strbd.reverse().toString()))){
        answer = "YES";
    }
    else answer = "NO";

    return answer;
}

replaceAll 이용

public String solution(String str) {
	String answer = "NO";
    str = str.toUpperCase().replaceAll("^[A-Z]", "");
    String tmp = new StringBuilder(str).reverse().toString();
    if(str.equals(tmp)) answer = "YES";
    return answer;
}
profile
신입 개발자의 개인 공부 공간입니다

0개의 댓글