125. Valid Palindrome

2025. 10. 22. 16:31·Coding Test/LeetCode

난이도: 중간 (Medium)

링크: LeetCode 125

풀이 날짜: 2025/10/22

 

1. 문제 이해

문자열에서 알파벳과 숫자만 고려하고, 대소문자 구분 없이 회문(Palindrome.  뒤집었을때 원문과 동일한지) 여부를 판단하는 문제.

 

 

2. 풀이 방법 비교

방법 1 — 전체 전처리 후 뒤집기

var isPalindrome = function(s) {
  const string = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase();
  const reverse = string.split('').reverse().join('')
  return string === reverse
};
  • 정규식을 이용해 알파벳/숫자만 남김
  • 모두 소문자로 변환 후 뒤집기
  • 마지막에 문자열 비교

장점: 코드 간결, 이해 쉽다

단점:

  1. 문자열 전체를 새로 생성 → O(n) 공간
  2. 문자열 뒤집기 split('') + reverse + join('') → O(n) 시간
  3. 결과적으로 총 O(n) 시간 & O(n) 공간

방법 2 — 투 포인터(Left/Right) 직접 비교

function isAlphaNumeric(char) {
  return /^[a-z0-9]$/i.test(char);
}

var isPalindrome = function(s) {
  let left = 0;
  let right = s.length - 1;

  while (left < right) {
    while (left < right && !isAlphaNumeric(s[left])) left++;
    while (left < right && !isAlphaNumeric(s[right])) right--;

    if (s[left].toLowerCase() !== s[right].toLowerCase()) return false;

    left++;
    right--;
  }

  return true;
};
  • 문자열을 전처리하지 않고 원본에서 직접 비교
  • 알파벳/숫자가 아닌 경우 건너뛰기
  • 양쪽에서 동시에 비교하면서 회문 검사

장점:

  1. 공간 효율적 → O(1) 추가 공간
  2. 필요한 경우에만 문자를 소문자로 변환 → 불필요한 처리 없음
  3. 시간 효율 좋음 → O(n), 상수 계수 작음

단점: 코드가 조금 더 길고 직관적이지 않을 수 있음

 

3. 핵심 포인트 비교

개념 방법 1: 뒤집기방법  2: 투 포인터
시간 복잡도 O(n) O(n)
공간 복잡도 O(n) O(1)
처리 방식 문자열 전처리 후 뒤집기 원본에서 투 포인터 비교
특징 코드 간결 메모리 효율적, 상수 계수 작음

 

 

4. 결론

  • 작은 문자열, 간단한 문제 → 방법 1 사용 가능
  • 대규모 문자열, 공간 효율 필요 → 방법 2 추천

투 포인터는 대부분 “연속 데이터 회문 검사” 문제에서 가장 효율적 패턴이다.

'Coding Test > LeetCode' 카테고리의 다른 글

20. Valid Parentheses  (0) 2025.10.22
128. Longest Consecutive Sequence  (0) 2025.10.21
49. Group Anagrams  (0) 2025.10.21
57. Insert Interval  (0) 2025.10.20
56. Merge Intervals  (0) 2025.10.20
'Coding Test/LeetCode' 카테고리의 다른 글
  • 20. Valid Parentheses
  • 128. Longest Consecutive Sequence
  • 49. Group Anagrams
  • 57. Insert Interval
JTB
JTB
웹/앱 개발 정보를 공유하고 있습니다.
  • JTB
    JTechBlog
    JTB
  • 전체
    오늘
    어제
    • All About Programming;)
      • Other than Tech
        • 잡생각
      • Computer Science
        • Terminology and Concepts
        • Network
        • Operating System
        • Database
        • Data Structure
        • Web Development
      • Frontend
        • Javascript Essentials
        • Perfomance Optimization
        • JS Patterns
        • React
        • Next.js
        • Flutter
        • Testing
      • Backend
        • Node.js
      • DevOps
        • Docker & Kubernetes
      • Coding Test
        • LeetCode
        • Programmers
      • Tech Books & Lectures
        • Javascript_Modern JS Deep d..
        • Network_IT 엔지니어를 위한 네트워크 입문
      • Projects
        • PolyLingo_2025
        • Build Your Body_2024
        • JStargram_2021
        • Covid19 Tracker_2021
        • JPortfolio_2021
      • BootCamp_Codestates
        • TIL
        • TILookCloser
        • Pre Tech Blog
        • IM Tech Blog
        • Daily Issues and DeBugging
        • First Project
        • Final Project
        • Sprint Review
        • Good to Know
        • Socrative Review
        • HTML &amp; CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 글쓰기
    • 관리
  • 공지사항

  • 인기 글

  • 태그

    testing
    자바스크립트
    Time complexity and Space complexity
    Network
    Data Structure
    How memory manage data
    자바스크립트 딥다이브
    CPU scheduling algorithm
    모던 자바스크립트 Deep Dive
    스코프
    프론트엔드 성능 최적화 가이드
    DOM
    need a database
    Binary Tree BFS
    indie hacker
    Shared resources
    커리어
    Operating System
    딥다이브
    structure of os
    TCP/IP
    이벤트
    mobile app
    database
    leetcode
    Threads and Multithreading
    VoiceJournal
    js pattern
    Javascript Essentials
    polylingo
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
JTB
125. Valid Palindrome
상단으로

티스토리툴바