LeetCode Palindrome Number

개발프로그·2024년 3월 5일
0

코딩테스트

목록 보기
1/7

안녕하세요. 자바를 활용하여 코딩테스트를 풀려고 합니다.

코딩테스트의 공포증으로 인하여 easy 난이도부터 접근합니다..

LeetCode easy 난이도의 두 번째 문제인 Palindrome Number에 대한 제 나름의 접근법 및 해결 과정에 대해 작성하겠습니다. 출발~

먼저, Palindrome 문제입니다.

출처: https://leetcode.com/problems/palindrome-number/

Palindrome을 처음 봐서 찾아보니 회문이라고 합니다. 네이버에서는 "회문(回文: madam이나 nurses run처럼 앞에서부터 읽으나 뒤에서부터 읽으나 동일한 단어나 구)"라고 나와있네요.

제 접근법은 먼저 짝수와 홀수인 경우로 나눴습니다. 만약 짝수이면 2로 나눠서 나눈수 기준으로 앞의 원소들은 첫 번째 원소부터 뒤의 원소들은 마지막 원소부터 같은지 다른지를 비교하려고 합니다.

홀수라면 딱 2로 나누면 중간값이 기준이 되니까 더 쉽겠네요!

문제가 생겼습니다.. 원소의 개수가 짝수인 경우를 생각해보니 중간값은 원소가 아니라 빈 공간입니다.

[1, 2, 3 | 3, 2, 1] <= 여기서 막대기 부분..

그래서 생각한 것이 2로 나누면 막대기 앞의 부분이 인덱스 값이니(6/2 = 3이므로) 먼저 원소의 개수가 짝수인 경우는 개수를 2로 나눈 인덱스와 그 이전 원소의 값을 먼저 비교하자 입니다. 이 중앙 두 값이 맞지 않으면 일단 Palindrome이 아닐 테니까요!

그 다음에 처음에 생각한 첫 번째 이후의 원소들과 대칭되는 마지막 원소들을 비교한 값 이전까지 비교하면 됩니다.(중간은 이미 비교했으므로)

또 다른 문제가 생겼습니다. 자바라는 언어가 처음이고 js와 python에 익숙하다보니 String을 인덱스로 접근하니까 오류가 발생합니다.

여기서 temp = Integer.toString(x);

integer 값을 toString으로 변환 후 바로 인덱스로 접근하니까 바로 오류 뿜뿜..
(위 사진은 temp[n/2]로 접근 이후의 사진이네요. 무슨 메서드가 있는지 몰라서 toArray를 써봤는데 지금 보니까 메서드 사용법이 아니라 속성에 접근하는 완전 혼종법이네요;;)

습관은 무섭고 아직 OOP 언어에는 익숙하지가 않습니다. 요즘 자바 기본서로 공부하고 있지만 다른 언어의 접근 방식으로 코딩했네요.. 구글링을 통해 toCharArray라는 method를 발견해서 테스트 하니까 바로 인덱스로 접근이 가능하네요! 역시 책을 본 후 직접 부딪혀 가면서 습득하는 게 제일 좋은 것 같네요. 이후에는 까먹지 않을 것 같습니다!

그리고 생각하는 것보다 직접 써 가면서 논리를 정리하면서 하면 생각의 오류를 잡을 수 있고 그 바탕으로 정확한 목적지를 찾을 수 있는 것 같아요!

밑은 제 풀이고요. 물론 다른 테스트 케이스에는 통과하지 않을 수 있습니다. 제가 어떻게 접근했고 어떤 식으로 풀었는지를 설명하고 싶었습니다. 틀린점 있거나 조언은 답변 부탁드려요! 긴 글 읽어주셔서 감사합니다!

class Solution {
    public boolean isPalindrome(int x) {
        String temp = Integer.toString(x);

        int n = temp.length();
        System.out.println(n);

        char[] charArr = temp.toCharArray();
        System.out.println(charArr);

        for (int i = 0; i < charArr.length; i++) {
            System.out.println(charArr[i]); 
        }

                    // 짝수일 때
        if (n % 2 == 0) {
            // 중간 값부터 같은지 다른지 비교하기
            if (charArr[n/2] == charArr[n/2 - 1]) {
                // n/2 이전 원소들은 처음부터 비교 이후 원소들은 마지막부터 비교
                for (int i = 0; i < n/2 - 2; i++) {
                    if (charArr[i] != charArr[n - 1 - i]) {
                        return false;
                    }
                }
                return true;
            } else {
                return false;
            }
        } else {
            // n이 홀수일 때
            for (int i = 0; i < n/2 - 2; i++) {
                if (charArr[i] != charArr[n - 1 - i]) {
                    return false;
                }
            }
            return true;
        }
    }
}

나중에 코테 공포증을 극복하고 다시 문제를 보기 위해 테스트 케이스를 통과한 문제에 대한 답은 나중에 보겠습니다!

profile
신입개발자

0개의 댓글