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;)
      • 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
  • 블로그 메뉴

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

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

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바