백준 10988번: 팰린드롬인지 확인하기

레곤토르닉·2025년 8월 19일
0

BaekJoon

목록 보기
44/64
post-thumbnail

백준 10988번: 팰린드롬인지 확인하기

주어진 단어가 앞에서부터 읽을 때와 뒤에서부터 읽을 때가 같은지, 즉 '팰린드롬(Palindrome)'인지 판별하는 문제입니다. 문자열의 양쪽 끝에서부터 중앙으로 좁혀오며 비교하는 투 포인터(Two Pointers) 알고리즘의 기초를 연습하기 좋은 문제입니다.


✅ 문제 개요

항목내용
문제 번호10988번 - 팰린드롬인지 확인하기
난이도브론즈 2
핵심 알고리즘구현, 문자열

✅ 문제 설명 요약

  • 입력: 첫째 줄에 알파벳 소문자로만 이루어진 단어가 주어집니다. (길이 1 이상 100 이하)
  • 출력: 팰린드롬이면 1, 아니면 0을 출력합니다.
  • 규칙:
    • 팰린드롬은 '기러기', '토마토', 'level'처럼 거꾸로 읽어도 똑같은 단어를 의미합니다.

✅ 풀이 전략

팰린드롬의 정의는 "첫 글자와 마지막 글자가 같고, 두 번째 글자와 끝에서 두 번째 글자가 같고..."를 만족하는 것입니다. 이 정의를 그대로 코드로 옮기는 것이 가장 직관적인 풀이법입니다.

1️⃣ 핵심 아이디어: 양 끝에서부터 비교하기

  • 문자열의 맨 앞을 가리키는 포인터(start)와 맨 뒤를 가리키는 포인터(end)를 둡니다.
  • 두 포인터가 가리키는 문자를 비교하고, 같으면 포인터를 각각 중앙으로 한 칸씩 이동시킵니다.
  • 이 과정을 두 포인터가 만나거나 교차할 때까지 반복합니다.

2️⃣ 투 포인터(Two Pointers) 알고리즘

  • 이러한 방식을 '투 포인터' 알고리즘이라고 합니다.
  • 동작 과정:
    1. start 포인터를 인덱스 0에, end 포인터를 문자열 길이 - 1에 둡니다.
    2. startend보다 작을 동안 반복합니다.
    3. 만약 word.charAt(start)word.charAt(end)가 다르다면, 팰린드롬이 아니므로 즉시 '아니다'라고 결론 내고 종료합니다.
    4. 두 문자가 같다면, 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 출력.


✅ Java 코드 예제

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 포인터가 가리키는 문자가 하나라도 다르면 즉시 팰린드롬이 아님을 판정하고 종료합니다.
✔️ 반복문이 중간에 종료되지 않고 끝까지 실행된다면, 그 단어는 팰린드롬입니다.

profile
기록은 나의 무기, 원칙은 나의 방패

0개의 댓글