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 메서드는 start와 end라는 두 개의 포인터를 사용하며, 각각 문자열의 시작과 끝에서 시작합니다. 루프는 두 포인터가 중간에서 만날 때까지 실행됩니다.

각 반복에서 start 및 end 포인터의 문자를 비교합니다. 같지 않으면 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. start 및 end 인덱스의 문자가 같지 않으면 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 메서드를 사용하여 ith 및 n-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)

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