728x90
반응형
✔️ 오늘의 리트코드 공부 기록 – Valid Palindrome
문제 요약 (Valid Palindrome)
문자열이 주어질 때,
알파벳과 숫자만 고려하여 (대소문자는 무시) 문자열이 회문(Palindrome)인지 판별하라.
문제링크: https://leetcode.com/problems/valid-palindrome/
🤔 처음 떠올린 아이디어
처음엔 이렇게 생각했다.
공백이랑 특수문자를 다 제거해서
새 배열을 하나 만들고, 뒤집어서 비교하면 되지 않을까?
즉,
- 문자열 정제
- 새 문자열 생성
- reverse 해서 비교
이 방식은 직관적이지만 어딘가 찝찝했다.
“굳이 새 배열을 꼭 만들어야 하나?”
💡 회문은 결국
👉 앞과 뒤가 같은지 비교하는 문제다.
그렇다면
굳이 정제된 문자열을 새로 만들지 않아도
양쪽에서 동시에 검사하면 되지 않을까?
회문 문제는 거의 공식처럼 등장하는 패턴이 있다.
Left → ← Right
양쪽에서 시작해서 중앙으로 좁혀오는 방식이다.
여기서 추가 조건만 처리해주면 된다.
- 알파벳/숫자 아니면 건너뛰기
- 대소문자 통일
- 다르면 바로 false
🔎 알고리즘 흐름 정리
- left = 0, right = n-1
- left < right 동안 반복
- 특수문자는 건너뛴다
- 대소문자 무시하고 비교
- 다르면 false
- 끝까지 통과하면 true
코드(Java)
class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
while (left < right &&
!Character.isLetterOrDigit(s.charAt(left))) {
left++;
}
while (left < right &&
!Character.isLetterOrDigit(s.charAt(right))) {
right--;
}
if (Character.toLowerCase(s.charAt(left)) !=
Character.toLowerCase(s.charAt(right))) {
return false;
}
left++;
right--;
}
return true;
}
}
📈 시간 / 공간 복잡도
- 시간: O(N)
- 공간: O(1)
각 문자를 최대 한 번씩만 확인한다.
정규식 풀이
String cleaned = s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
return cleaned.equals(new StringBuilder(cleaned).reverse().toString());
이 방식은
- 코드가 짧다
- 직관적이다
- 대신 O(N) 공간 사용
인터뷰에서는 보통
👉 O(1) 공간 풀이를 더 선호한다.
📝 이번 문제에서 얻은 깨달음
- 회문 문제는 “문자열 문제”가 아니라 “투 포인터 문제”다.
- 문자열을 새로 만들지 말고 조건을 이동 과정에서 처리하자.
728x90
반응형
'Algorithms' 카테고리의 다른 글
| [LeetCode] 128. Longest Consecutive Sequence 풀이 (Java) (0) | 2026.02.08 |
|---|---|
| [LeetCode] 124. Binary Tree Maximum Path Sum 풀이 (Java) (0) | 2026.02.06 |
| [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 풀이 (0) | 2026.02.03 |
| [LeetCode] 102. Binary Tree Level Order Traversal 풀이 (Java) (0) | 2026.02.01 |
| [LeetCode] 98. Validate Binary Search Tree 풀이 (Java) (0) | 2026.01.30 |