링크: https://leetcode.com/problems/simplify-path/
이름: Simplify Path
난이도: Medium
이 문제는 주어진 경로를 절대 경로 형식에 올바르게끔 변환해 return하는 문제이다.
ex)
Input:
/home/document/
Output:/home/document
Input:
/home/../document//
Output:/document
와 같은 형식으로 올바르게 절대 경로를 만들어 주어야 한다.
우선 /
가 나오면 해당 슬래쉬를 기준으로 문자열을 split 해주었다.
하지만 split을 했을 경우,
/home/의 경우에는
["","home",""]와 같이 나누어지기 때문에 빈 공간인
""`를 filter를 통해 없애주었다.
paths = path.split('/').filter(path=>path !== '')
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('/')
};
스택은 간단하게 아래 이미지로 설명 가능하다.
(출처: https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D)
Stack은 LIFO라고도 불리우며, 풀어쓰면 Last In First Out이다.
이러한 자료구조는 JavaScript에서 실행 컨텍스트의 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)