LeetCode 71. Simplify Path(JavaScript)

자몽·2021년 12월 30일
1

알고리즘

목록 보기
19/31

문제

링크: https://leetcode.com/problems/simplify-path/
이름: Simplify Path
난이도: Medium

설명

이 문제는 주어진 경로를 절대 경로 형식에 올바르게끔 변환해 return하는 문제이다.
ex)

Input: /home/document/
Output: /home/document

Input: /home/../document//
Output: /document

와 같은 형식으로 올바르게 절대 경로를 만들어 주어야 한다.

풀이

step 1

우선 /가 나오면 해당 슬래쉬를 기준으로 문자열을 split 해주었다.
하지만 split을 했을 경우,
/home/의 경우에는 ["","home",""]와 같이 나누어지기 때문에 빈 공간인 ""`를 filter를 통해 없애주었다.

paths = path.split('/').filter(path=>path !== '')

step 2

paths 배열에 저장된 주소들을 보며, 예외 처리를 해주어야 한다.

예외 1. ..가 있을 경우 앞의 경로를 삭제
예외 2. .는 현재 디렉토리를 의미하므로, .를 무시

이런 예외 처리를 하고, 올바른 경로들은 stack에 push하면 다음과 같은 코드가 완성된다.

for (const element of paths) {
  if (element === '..') {
    stack.pop()
  } else if (element === '.') {
    continue;
  } else {
    stack.push(element)
  }
}

전체 코드

var simplifyPath = function(path) {
    let stack = [];

    paths = path.split('/').filter(path=>path !== '')

    for (const element of paths) {
        if (element === '..') {
            stack.pop()
        } else if (element === '.') {
            continue;
        } else {
            stack.push(element)
        }
    }
    
    return '/'+stack.join('/')
};

배경 지식: Stack

스택은 간단하게 아래 이미지로 설명 가능하다.

(출처: https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D)
StackLIFO라고도 불리우며, 풀어쓰면 Last In First Out이다.

이러한 자료구조는 JavaScript에서 실행 컨텍스트의 Call Stack에서 사용된다.

실행 컨텍스트 & Call Stack

실행 컨텍스트는 자바스크립트의 동작 원리를 담고 있는 핵심 개념으로, 소스코드를 실행하는데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다.

const x = 1;
function foo(){
  const y = 2;
  
  function bar(){
    const z = 3;
    console.log(x+y+z);
  }
  bar();
}
foo();

자바스크립트 엔진은 위의 코드를 전역 코드를 평가부터 시작해 함수를 하나하나 평가한다.
이 때 생성되는 실행 컨텍스트는 스택 자료구조로 관리되어, 마지막으로 넣어진 자료가 가장 먼저 삭제된다.

(출처: https://github.com/BKJang/do-you-know-vanilla/issues/14)

profile
꾸준하게 공부하기

0개의 댓글