문제
알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다.
level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.
입력
첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.
출력
첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.
예제 입력 1 복사
level
예제 출력 1 복사
1
예제 입력 2 복사
baekjoon
예제 출력 2 복사
0
내가 작성한 코드
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String S = sc.next();
String[] arr = new String[S.length()]; // 입력받은 문자열을 저장할 배열
String[] reArr = new String[S.length()]; // 저장한 배열을 뒤집어서 저장할 배열
for (int i = 0; i < S.length(); i++) { // 입력받은 문자열을 arr[]에 저장
arr[i] = String.valueOf(S.charAt(i));
}
for (int i = 0; i < S.length(); i++) { // arr[]을 뒤집어서 저장할 reArr[]
reArr[arr.length - 1 - i] = arr[i];
}
if (Arrays.equals(arr, reArr)) { // arr[]과 reArr[] 비교
System.out.println("1");
} else {
System.out.println("0");
}
}
}
결과
GPT가 알려주는 효율적인 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String S = sc.next();
// 문자열의 길이만큼 시작과 끝을 가리키는 포인터를 초기화합니다.
int start = 0;
int end = S.length() - 1;
boolean isPalindrome = true;
// 시작 포인터와 끝 포인터가 중간에서 만날 때까지 문자를 비교하여 회문인지 확인합니다.
while (start < end) {
if (S.charAt(start) != S.charAt(end)) {
isPalindrome = false;
break;
}
start++;
end--;
}
if (isPalindrome) {
System.out.println("1");
} else {
System.out.println("0");
}
}
}
위 수정된 코드와 동일한 기능을 수행하지만, 불필요한 배열과 Arrays.equals() 메서드를 사용하지 않아 더 효율적이라고 한다.
좀 더 공부를 해서 효율적인 코드를 짤 수 있도록 해야겠다.
'JAVA' 카테고리의 다른 글
JAVA 상속 extends [Interface, Inheritance] (2) | 2023.10.10 |
---|---|
JAVA 객체지향 관련 [Optional, if문, Getter/Setter] (0) | 2023.10.10 |
JAVA 데이터베이스 연동 (2) [리포지토리, DAO 설계] (0) | 2023.08.29 |
JAVA 데이터베이스 연동 (1) [ORM, JPA, 영속성 컨텍스트, 엔티티] (2) | 2023.08.29 |
[문제풀이] 백준 JAVA - #10807 개수 세기 (0) | 2023.07.17 |