주어진 단어가 앞에서부터 읽을 때와 뒤에서부터 읽을 때가 같은지, 즉 '팰린드롬(Palindrome)'인지 판별하는 문제입니다. 문자열의 양쪽 끝에서부터 중앙으로 좁혀오며 비교하는 투 포인터(Two Pointers) 알고리즘의 기초를 연습하기 좋은 문제입니다.
항목 | 내용 |
---|---|
문제 번호 | 10988번 - 팰린드롬인지 확인하기 |
난이도 | 브론즈 2 |
핵심 알고리즘 | 구현, 문자열 |
팰린드롬의 정의는 "첫 글자와 마지막 글자가 같고, 두 번째 글자와 끝에서 두 번째 글자가 같고..."를 만족하는 것입니다. 이 정의를 그대로 코드로 옮기는 것이 가장 직관적인 풀이법입니다.
start
)와 맨 뒤를 가리키는 포인터(end
)를 둡니다.start
포인터를 인덱스 0에, end
포인터를 문자열 길이 - 1
에 둡니다.start
가 end
보다 작을 동안 반복합니다.word.charAt(start)
와 word.charAt(end)
가 다르다면, 팰린드롬이 아니므로 즉시 '아니다'라고 결론 내고 종료합니다.start
를 1 증가시키고 end
를 1 감소시켜 비교 범위를 좁힙니다.예시: level
(길이 5)
1. 초기 상태: start=0
('l'), end=4
('l')
2. 비교 1: charAt(0)
== charAt(4)
. 일치. start
는 1, end
는 3으로 이동.
3. 비교 2: charAt(1)
('e') == charAt(3)
('e'). 일치. start
는 2, end
는 2로 이동.
4. 종료: start < end
(2 < 2) 조건이 거짓이 되어 반복문 종료.
5. 결론: 중간에 다른 문자가 없었으므로 팰린드롬. 1 출력.
예시: hello
(길이 5)
1. 초기 상태: start=0
('h'), end=4
('o')
2. 비교 1: charAt(0)
!= charAt(4)
. 불일치.
3. 종료: 즉시 반복문을 멈추고 팰린드롬이 아니라고 결론. 0 출력.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class Main {
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 word = br.readLine();
int result = 1; // 기본값을 1(팰린드롬)로 설정
int start = 0;
int end = word.length() - 1;
// 투 포인터가 교차하기 전까지 반복
while (start < end) {
// 양 끝의 문자가 다르면 팰린드롬이 아님
if (word.charAt(start) != word.charAt(end)) {
result = 0;
break; // 더 이상 비교할 필요가 없으므로 반복 종료
}
// 포인터를 중앙으로 이동
start++;
end--;
}
bw.write(String.valueOf(result));
bw.flush();
bw.close();
br.close();
}
}
항목 | 설명 |
---|---|
가장 간결한 풀이 | StringBuilder 를 사용하면 new StringBuilder(input).reverse().toString().equals(input) 와 같이 한 줄로도 팰린드롬을 판별할 수 있습니다. 알고리즘 학습을 위해서는 투 포인터 방식을 연습하는 것이 좋습니다. |
반복문 조건 | 투 포인터의 반복문 조건은 start < end 입니다. start <= end 로 해도 되지만, 단어 길이가 홀수일 때 가운데 문자를 자기 자신과 불필요하게 비교하는 과정이 추가됩니다. |
효율성 | 투 포인터 방식은 문자열의 절반만 비교하므로 시간 복잡도가 O(N/2), 즉 O(N)으로 매우 효율적입니다. |
기본값 설정 | 팰린드롬이라고 가정한 상태(result = 1 )에서 시작하여, 다른 문자를 발견했을 때만 0 으로 바꾸는 방식으로 코드를 작성할 수도 있습니다. |
✔️ 팰린드롬 문제는 양쪽 끝에서 중앙으로 좁혀오며 문자를 비교하는 것이 정석적인 풀이법입니다.
✔️ 이 아이디어를 코드로 구현하는 가장 효율적인 방법이 바로 투 포인터(Two Pointers) 알고리즘입니다.
✔️ start
포인터와 end
포인터가 가리키는 문자가 하나라도 다르면 즉시 팰린드롬이 아님을 판정하고 종료합니다.
✔️ 반복문이 중간에 종료되지 않고 끝까지 실행된다면, 그 단어는 팰린드롬입니다.