카테고리 없음

8. 유효한 팰린드롬

yki1204 2021. 4. 15. 06:12

문제 설명

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

단, 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.

 

입력예시: found7, time: study; Yduts; emit, 7Dnuof

출력예시: YES

문제 풀이

초기 접근 아이디어는 앞에서 사용한 lt, rt를 사용해 중앙으로 이동하면서 모두 문자라면 서로 값이 같은지 비교 하는 방법이다.

public String solution(String s) {
	
	String result = "YES";
	int lt = 0, rt = s.length() -1;
	
	while(lt < rt) {
		
		if(!Character.isAlphabetic(s.charAt(lt))) {
			lt++;
		}else if(!Character.isAlphabetic(s.charAt(rt))) {
			rt--;
		}else if(Character.toLowerCase(s.charAt(lt)) != Character.toLowerCase(s.charAt(rt))) {
			return "NO";
		}else {
			lt++;
			rt--;
		}
	}
	
	return result;
}

 

조금 더 좋은 방법은 replaceAll 정규식을 사용하여 불필요한 문자를 제거 후 비교하는 방법이다.

public String solution2(String s) {
	
	String result = "NO";
	
	s = s.toLowerCase().replaceAll("[^a-z]", "");
	
	System.out.println(s);
	String reverseString = new StringBuilder(s).reverse().toString();
	
	if(s.equals(reverseString)) {
		result = "YES";
	}
	
	return result;
}

전체를 소문자로 변환 후 replaceAll("[^a-z]", "") 를 사용하면 소문자 이외에 모든 문자가 제거된다.

이후 reverse를 한 후 equals 비교하여 결과를 출력하였다.