[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;

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