소개
이 랩에서는 Java 에서 문자열이 회문 (palindrome) 인지 확인하는 방법을 배웁니다. 회문은 앞뒤로 읽어도 동일한 문자열입니다.
이 랩에서는 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 메서드는 재귀를 사용하여 문자열이 회문인지 확인합니다. 두 가지 기본 사례가 있습니다.
start 인덱스가 end 인덱스보다 크거나 같으면 문자열의 모든 문자를 확인했고 일치한다는 의미이므로 true를 반환합니다.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 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 에서 주어진 문자열이 회문인지 확인하는 방법을 배웠습니다. 이 작업을 수행하기 위해 네 가지 다른 메서드를 구현했습니다.
이제 이러한 메서드를 이해했으므로, 더 복잡한 문제를 해결하는 데 사용할 수 있습니다!