Java 에서 회문 확인하기

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 문자열이 회문 (palindrome) 인지 확인하는 방법을 배웁니다. 회문은 앞뒤로 읽어도 동일한 문자열입니다.

투 포인터를 사용하여 회문 확인하기

첫 번째로 구현할 방법은 두 개의 포인터 접근 방식입니다. 문자열을 입력으로 받아 문자열이 회문인지 여부를 나타내는 부울 값을 반환하는 isPalindrome이라는 메서드를 생성합니다.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        int start = 0;
        int end = str.length() - 1;

        while (start < end) {
            char startChar = Character.toLowerCase(str.charAt(start));
            char endChar = Character.toLowerCase(str.charAt(end));

            if (startChar != endChar) {
                return false;
            }

            start++;
            end--;
        }

        return true;
    }
}

isPalindrome 메서드는 startend라는 두 개의 포인터를 사용하며, 각각 문자열의 시작과 끝에서 시작합니다. 루프는 두 포인터가 중간에서 만날 때까지 실행됩니다.

각 반복에서 startend 포인터의 문자를 비교합니다. 같지 않으면 false를 반환합니다. 같으면 포인터를 업데이트하여 문자열의 다음 문자 집합을 확인합니다.

메서드를 테스트하기 위해 main 메서드를 추가하고 다양한 입력 문자열로 isPalindrome 메서드를 호출할 수 있습니다.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementation of isPalindrome method
    }

    public static void main(String[] args) {
        System.out.println("Is 'racecar' a palindrome? " + isPalindrome("racecar"));
        System.out.println("Is 'hello' a palindrome? " + isPalindrome("hello"));
    }
}

재귀를 사용하여 회문 확인하기

다음으로 구현할 방법은 재귀적 접근 방식입니다. 문자열, 시작 인덱스 및 종료 인덱스를 입력으로 받는 isPalindromeRecursive라는 새로운 메서드를 생성합니다.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        String lowercaseStr = str.toLowerCase();
        return isPalindromeRecursive(lowercaseStr, 0, lowercaseStr.length() - 1);
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        if(start >= end) {
            return true;
        }

        char startChar = Character.toLowerCase(str.charAt(start));
        char endChar = Character.toLowerCase(str.charAt(end));

        if(startChar != endChar) {
            return false;
        }

        return isPalindromeRecursive(str, start + 1, end - 1);
    }

    public static void main(String[] args) {
        // Tests for isPalindrome and isPalindromeRecursive methods
    }
}

isPalindromeRecursive 메서드는 재귀를 사용하여 문자열이 회문인지 확인합니다. 두 가지 기본 사례가 있습니다.

  1. start 인덱스가 end 인덱스보다 크거나 같으면 문자열의 모든 문자를 확인했고 일치한다는 의미이므로 true를 반환합니다.
  2. startend 인덱스의 문자가 같지 않으면 false를 반환합니다.

기본 사례가 모두 충족되지 않으면 업데이트된 인덱스로 isPalindromeRecursive를 다시 호출합니다.

이제 main 메서드 내에서 재귀 메서드를 호출하여 테스트할 수 있습니다.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementation of isPalindrome method
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        // Implementation of isPalindromeRecursive method
    }

    public static void main(String[] args) {
        System.out.println("Is 'racecar' a palindrome? " + isPalindromeRecursive("racecar", 0, 6));
        System.out.println("Is 'hello' a palindrome? " + isPalindromeRecursive("hello", 0, 4));
    }
}

문자열 뒤집기를 통한 회문 확인 방법

마지막으로 구현할 방법은 문자열 뒤집기 접근 방식입니다. 문자열을 입력으로 받는 isPalindromeReverse라는 새로운 메서드를 생성합니다.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementation of isPalindrome method
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        // Implementation of isPalindromeRecursive method
    }

    public static boolean isPalindromeReverse(String str) {
        String reversed = "";

        for (int i = str.length() - 1; i >= 0; i--) {
            reversed += str.charAt(i);
        }

        return str.equalsIgnoreCase(reversed);
    }

    public static void main(String[] args) {
        // Tests for isPalindrome and isPalindromeRecursive methods
        System.out.println("Is 'racecar' a palindrome? " + isPalindromeReverse("racecar"));
        System.out.println("Is 'hello' a palindrome? " + isPalindromeReverse("hello"));
    }
}

isPalindromeReverse 메서드는 reversed라는 새 문자열을 생성하고 입력 문자열을 끝에서 시작으로 반복하여 채웁니다. 그런 다음 두 문자열이 대소문자를 구분하지 않고 같으면 true를 반환합니다.

main 메서드에서 isPalindromeReverse를 호출하여 메서드를 테스트할 수 있습니다.

Java Streams 를 활용한 회문 (Palindrome) 검사 방법

마지막으로 Java Streams API 를 사용하여 회문을 확인합니다. 문자열을 입력으로 받는 isPalindromeStream이라는 새로운 메서드를 생성합니다.

import java.util.stream.IntStream;

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementation of isPalindrome method
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        // Implementation of isPalindromeRecursive method
    }

    public static boolean isPalindromeReverse(String str) {
        // Implementation of isPalindromeReverse method
    }

    public static boolean isPalindromeStream(String str) {
        String lowercaseStr = str.toLowerCase();

        return IntStream.range(0, lowercaseStr.length() / 2)
                .noneMatch(i -> lowercaseStr.charAt(i) != lowercaseStr.charAt(lowercaseStr.length() - i - 1));
    }

    public static void main(String[] args) {
        // Tests for isPalindrome and isPalindromeRecursive methods
        System.out.println("Is 'racecar' a palindrome? " + isPalindromeStream("racecar"));
        System.out.println("Is 'hello' a palindrome? " + isPalindromeStream("hello"));
    }
}

isPalindromeStream 메서드는 IntStream 클래스를 사용하여 문자열의 문자를 비교하는 데 사용할 수 있는 인덱스 범위를 생성합니다.

noneMatch 메서드를 사용하여 ithn-i-1th 문자가 같다는 조건 (여기서 n은 문자열의 길이이고 i는 인덱스임) 을 위반하는 문자가 없으면 true를 반환합니다.

main 메서드에서 isPalindromeStream을 호출하여 메서드를 테스트할 수 있습니다.

요약

이 Lab 에서는 Java 에서 주어진 문자열이 회문인지 확인하는 방법을 배웠습니다. 이 작업을 수행하기 위해 네 가지 다른 메서드를 구현했습니다.

  1. 투 포인터 접근 방식 (Two-pointer approach)
  2. 재귀 접근 방식 (Recursive approach)
  3. 문자열 뒤집기 접근 방식 (Reversing the string approach)
  4. Java Streams 접근 방식 (Java Streams approach)

이제 이러한 메서드를 이해했으므로, 더 복잡한 문제를 해결하는 데 사용할 수 있습니다!