10988 팰린드롬인지 확인하기
알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다.
level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.
입력
첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.
출력
첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.
예제 입력 1
level
예제 출력 1
1
예제 입력 2
baekjoon
예제 출력 2
0
풀이 - 반복문 사용
0번째 index부터 length / 2 -1 번째 index까지 문자 char가 length - 0번째부터 length / 2 + 1번째 index까지 문자와 같은지 확인한다.
lenght / 2 - 1 까지 반복문이 통과하게 되면 팰린드롬이다.
소스 코드 1
import java.util.Scanner;
public class p10988 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String word = scanner.nextLine();
boolean isPalindrome = true;
for (int i = 0; i < word.length() / 2; i++) {
if (word.charAt(i) != word.charAt(word.length() - 1 - i)) {
isPalindrome = false;
break;
}
}
System.out.println(isPalindrome ? 1 : 0);
scanner.close();
}
}
Refactoring
BufferedReader는 대량의 텍스트 데이터를 빠르게 처리하는 데 적합하며,
Scanner는 형식화된 데이터를 편리하게 읽고 파싱하는 데 적합합니다.
BufferedReader | Scanner | |
Buffer Size | 8192 | 1024 |
Syncronized | O | X |
문자열 파싱 | 단순히 읽어옴 | 문자열 파싱 가능 |
Exception | IOException 던짐 | IOException 숨김 |
소스 코드 2
import java.io.*;
import java.util.Scanner;
public class p10988 {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
String word = bufferedReader.readLine();
int isPalindrome = 1;
for (int i = 0; i < word.length() / 2; i++) {
if (word.charAt(i) != word.charAt(word.length() - 1 - i)) {
isPalindrome = 0;
break;
}
}
bufferedWriter.write(String.valueOf(isPalindrome));
bufferedWriter.flush();
bufferedWriter.close();
bufferedReader.close();
}
}
배운 점
1. 시간 개선 (208ms에서 128ms로 감소)
Scanner는 입력 스트림에서 한번에 한 문자 또는 문자열을 읽는데 비교적 느린 성능을 보일 수 있다. 이는 입력 스트림에서 데이터를 하나씩 읽어오기 때문이다.
반면에 BufferedReader는 버퍼링을 통해 한 번에 더 많은 데이터를 읽어오기 때문에 입출력 작업을 효율적으로 수행한다. 버퍼링은 입출력 속도를 향상시키는 주된 이유 중 하나이다.
2. 메모리 개선 (17712KB에서 14324KB로 감소)
Scanner와 BufferedReader 모두 메모리를 사용하지만, Scanner는 버퍼링을 적게 사용하거나 사용하지 않는 경우가 많다. 따라서 Scanner를 사용할 때는 입력 데이터를 한 번에 읽어와서 처리하므로 더 많은 메모리가 필요할 수 있다.
반면에 BufferedReader는 데이터를 버퍼에 저장하고 한 번에 처리하므로 메모리 사용량이 줄어든다. 이는 버퍼링이 메모리 사용을 최적화하는데 도움이 된다.
결론적으로 BufferedReader는 입출력 작업을 효율적으로 처리하고 메모리를 더 효율적으로 사용하므로 성능 개선과 메모리 사용량 감소를 가져올 수 있다. 따라서 BufferedReader는 대량의 데이터를 처리하거나 빠른 입출력 속도가 필요한 경우 유용하다.
'알고리즘 > BaekJoon' 카테고리의 다른 글
[백준 / Java] 2750 수 정렬하기 (0) | 2023.10.10 |
---|---|
[백준 / Java] 1546 평균 (0) | 2023.10.03 |
[백준 / Java] 25206 너의 평점은 (0) | 2023.09.30 |
[백준 / Java] 1316 그룹 단어 체커 (0) | 2023.09.30 |
[백준 / Java] 10824 네 수 (0) | 2023.09.28 |