KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (486)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (431)
      • 백준 (187)
      • Programmers (104)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • programmers
  • Level 1
  • recursion
  • 정렬
  • 백준
  • 다이나믹 프로그래밍
  • tree
  • C++
  • Level1
  • string
  • 문자열
  • C
  • codeup
  • 수학
  • 그래프
  • js
  • 제코베 JS 100제
  • LeetCode
  • Level 0
  • Level 2

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

PS/LeetCode

LeetCode / String /392번 / Is Subsequence / JS

2023. 3. 27. 20:46

< 문제 바로가기 >

 

Is Subsequence - LeetCode

Can you solve this real interview question? Is Subsequence - Given two strings s and t, return true if s is a subsequence of t, or false otherwise. A subsequence of a string is a new string that is formed from the original string by deleting some (can be n

leetcode.com

 

< 문제 간단설명 >

문자열로 s와 t가 주어진다. 이때 주어진 s의 각각 문자가 s에서의 순서를 지키면서 t에 속하는지 판단하면 되는 문제이다.

 

예를들어 s = 'abc', t = 'ahbgdc' 와 같이 주어졌다고 해보자.

s에서는 a, b, c가 차례대로 있다. t에서도 마찬가지로 a, h, b, g, d, c 에서 s에 속하는 a, b, c만 보면 차례를 지키고있다.

이해가 안되면 다음과 같이 색깔로 나타내면 이해가 쉬울것이다.

 

s = a b c

t = a h b g d c

 

따라서 위의 예시는 s의 모든 알파벳이 t에서 그대로 차례를 지키고 있기 때문에 true를 반환해준다.

 

또 다른 예시인 s = 'axc', t = 'ahbgdc' 와 같이 주어졌다고 해보자.

s에서의 'a'와 'c'는 t에서도 똑같이 순서를 지키고 있지만, s에 존재하는 'x'가 t에 없기 때문에 false를 반환한다.

 

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isSubsequence = function (s, t) {
  if (s.length === 0) return true;
  if (s.length > t.length) return false;

  let [pointerS, pointerT] = [0, 0];
  while (true) {
    if (pointerS === s.length || pointerT === t.length) {
      break;
    }

    if (s.at(pointerS) === t.at(pointerT)) {
      pointerS += 1;
      pointerT += 1;
    } else {
      pointerT += 1;
    }
  }

  return pointerS === s.length;
};

먼저 최상단의 조건문부터 살펴보자.

사실 s가 빈 문자열일 경우는 생각을 못하고 있었는데 테스트케이스에서 보니 빈 문자열일 경우 무조건 true라서 추가해주었다.

그리고 s가 t보다 문자열의 길이가 더 길다면 t에 속할 수 없으므로 무조건 false를 반환해준다.

 

그 후에는 각각 s와 t의 맨 앞을 가리키는 pointer인 pointerS와 pointerT 를 선언해서 two-pointer 방식으로 풀어주었다.

반복문으로 순회를 하게되는데, pointerS가 s끝에 다다르거나, pointerT가 t의 끝에 다다르면 반복문을 중단한다.

그리고 s와 t의 각각의 포인터가 현재 가리키는 문자가 같다면 pointerS와 pointerT 모두 하나씩 증가시켜준다.

만약 다르다면, 현재 s의 문자와 t의 그 다음문자를 비교해봐야 하므로 pointerT만 하나 증가시켜준다.

 

이런 방식으로 만약 pointerS가 s의 끝에 다다랐다면 모든 문자가 T에 속해있다는 뜻이므로 true를 반환하게 된다.

저작자표시 (새창열림)

'PS > LeetCode' 카테고리의 다른 글

LeetCode / Linked List / 206번 / Reverse Linked List / JS  (0) 2023.03.29
LeetCode / Linked List / 21번 / Merge Two Sorted Lists / JS  (0) 2023.03.29
LeetCode / String / 205번 / Isomorphic Strings / JS  (0) 2023.03.27
LeetCode / Prefix Sum / 724번 / Find Pivot Index / JS  (0) 2023.03.25
    'PS/LeetCode' 카테고리의 다른 글
    • LeetCode / Linked List / 206번 / Reverse Linked List / JS
    • LeetCode / Linked List / 21번 / Merge Two Sorted Lists / JS
    • LeetCode / String / 205번 / Isomorphic Strings / JS
    • LeetCode / Prefix Sum / 724번 / Find Pivot Index / JS
    KimMinJun
    KimMinJun

    티스토리툴바