문제
해결 방안 고민
•
앞으로 읽었을 때와 뒤로 읽었을 때의 문자열이 같으면 된다.
◦
이 조건을 잘 고려해야 한다.
◦
배열을 활용할 수도 있겠지만 최대한 배열을 활용하지 않고 문제를 푼다.
해결 방법
•
무한 반복문을 돌려서 팰린드롬의 여부를 확인하고 0을 입력했을 때 반복문을 빠져나온다.
•
앞의 글자와 뒤의 글자를 비교할 수 있도록 인덱스 매칭을 해준다.
◦
여기서 뒤의 글자를 지정하기 위해 idx 변수를 선언한다.
•
이분 탐색을 활용하여 문자열 길이의 절반만 반복하는 for문을 통해 같은지의 여부를 카운팅한다.
◦
카운팅을 하는 이유는 앞의 문자와 뒤의 문자가 모두 같게 되면 문자열 길이의 절반만큼의 수가 나오기 때문이다.
•
세 가지 방법으로 풀이하였다.
코드
•
첫 번째 방법
package algo250317;
import java.io.*;
// 백준 - 팰린드롬수 (브론즈 1)
public class Baek1259 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "";
while (true) {
str = br.readLine();
if (str.equals("0")) {
break;
}
int length = str.length();
int idx = length - 1;
int count = 0;
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) == str.charAt(idx)) {
count++;
}
idx--;
}
if (count == length / 2) {
System.out.println("yes");
} else {
System.out.println("no");
}
}
}
}
Java
복사
•
두 번째 방법 - StringBuilder 활용
package algo250317;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 - 팰린드롬수 (브론즈 1)
public class Baek1259_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String str = "";
while (true) {
str = br.readLine();
if (str.equals("0")) {
break;
}
int length = str.length();
int idx = length - 1;
int count = 0;
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) == str.charAt(idx)) {
count++;
}
idx--;
}
if (count == length / 2) {
sb.append("yes").append("\n");
} else {
sb.append("no").append("\n");
}
}
System.out.print(sb);
}
}
Java
복사
•
세 번째 방법 - BufferedWriter 활용
package algo250317;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Baek1259_3 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "";
while (true) {
str = br.readLine();
if (str.equals("0")) {
break;
}
int length = str.length();
int idx = length - 1;
int count = 0;
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) == str.charAt(idx)) {
count++;
}
idx--;
}
if (count == length / 2) {
bw.write("yes");
bw.newLine();
} else {
bw.write("no");
bw.newLine();
}
}
bw.flush();
bw.close();
br.close();
}
}
Java
복사
정리
•
속도는 2, 3 > 1 이렇게 나왔다.
•
확실히 StringBuilder가 속도 차이가 분명히 있음을 확인할 수 있었다.