[LeetCode][Grind 75] 125. Valid Palindrome

반응형

문제 해결 방안

  1. 아스키 코드를 통해 공백과 특수문자를 걸러냅니다.
  2. StringBuilder를 통해 걸러진 새로운 문자열을 생성하고, reverse 메소드를 통해 뒤집힌 문자열을 만들어 냅니다.
  3. 2개를 비교해서 같으면 True, 다르면 False를 반환합니다.

겪은 문제점

1. 아스키 코드

우선 아스키 코드를 써야한다는 것은 생각했지만, 알파벳과 숫자의 아스키 코드 값이 기억이 나지 않았습니다.

실제로 테스트를 하는 상황이었다면 좀 암담했을 거 같습니다.

2. 해당하지 않는 문자를 제거하다보니 String의 길이가 줄어들어서 예외 발생

처음에는 아스키 코드를 기준으로 제외할 문자들을 삭제하는 식으로 진행했습니다.

// s는 문제에서 입력받은 초기 문자열
StringBuilder str = new StringBuilder(s.toUpperCase());	//관련 메소드 사용을 위한 StringBuilder로 변환

for(int i=0; i<s.length(); i++){
    if((str.charAt(i) < 65 || str.charAt(i) > 90) || (48 > str.charAt(i) || str.charAt(i) > 57)){
        str.deleteCharAt(i);
    }
}

 

하지만 이렇게 하니, for문에서 i는 증가하고 있는데, str의 길이는 짧아지다보니 예외가 발생했습니다.

 

아래와 같이 새로운 문자열을 생성해주고, 해당하는 문자만 추가해주는 식으로 변경했습니다.

StringBuilder str = new StringBuilder(s.toUpperCase());
StringBuilder newStr = new StringBuilder();

for(int i=0; i<s.length(); i++){
    if((str.charAt(i)>=65 && str.charAt(i)<=90) || (48<=str.charAt(i) && str.charAt(i)<=57)){
        newStr.append(str.charAt(i));
    }
}

 

3. StringBuilder에 대한 이해 부족

reverse 메서드를 쓰긴 했는데, 이게 객체 자체를 변환하는 것을 인지 못하고 사용해서 처음에는 계속 True만 반환되는 상황이 생겼습니다.

// 기존 코드
// str은 원래 문자열
StringBuilder reverse = str.reverse();
if(str.toString().equals(reverse.toString()){
	return true;
}
return false;

 

이렇게 하니깐, str 객체 자체가 reverse되어 항상 같은 값이 나오는 것이었습니다.

 

그래서 아래와 같이 우선 기존 문자열을 새로운 객체에 담고 진행했습니다.

String origin = str.toString();
String reverse = str.reverse().toString();
if(origin.equals(reverse)){
    return true;
}
return false;

정답 코드

    public static boolean isPalindrome(String s) {
        StringBuilder str = new StringBuilder(s.toUpperCase());
        StringBuilder newStr = new StringBuilder();

        for(int i=0; i<s.length(); i++){
            if((str.charAt(i)>=65 && str.charAt(i)<=90) || (48<=str.charAt(i) && str.charAt(i)<=57)){
                newStr.append(str.charAt(i));
            }
        }
        
        String origin = newStr.toString();

        String reverse = newStr.reverse().toString();

        if(origin.equals(reverse)){
            return true;
        }
        return false;

    }
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유