LeetCode에서 매주 진행되는 Weekly Contest!
기록해두면 분명 유용하게 쓰일 날이 있을 것 같아 그 중에서도 특수문자로 이루어진 문자열 알고리즘 문제 Review를 남겨두려한다 :)
문제출처: https://leetcode.com/problems/crawler-log-folder/
The Leetcode file system keeps a log each time some user performs a change folder operation.
The operations are described below:
"../"
: Move to the parent folder of the current folder. (If you are already in the main folder, remain in the same folder).
"./"
: Remain in the same folder.
"x/"
: Move to the child folder named x (This folder is guaranteed to always exist).
You are given a list of strings logs where logs[i] is the operation performed by the user at the ith step.
The file system starts in the main folder, then the operations in logs are performed.
Return the minimum number of operations needed to go back to the main folder after the change folder operations.
'.'
, and '/'
.//요소의 갯수는 1000개보다 적고, 각 요소의 길이는 10보다 작다.
//정규표현식을 사용해서 logs[i]에서 특정 패턴이 매칭 될때마다 전역스코프의 (minimum)count 수를 변경한다.
console.log("current test case start")
var minOperations = function(logs) {
var count = 0;
for (var i = 0; i < logs.length; i++){
if (logs[i] === "./"){
//"./"같은 폴더에 유지 - 엄격일치
continue;
// count += 0;
} else if (/\.+\//.test(logs[i])){
//"../"parent 폴더로 이동
if (count !== 0){
//이미 메인폴더가 아닌 경우에만 subtract.
count--;
}
} else {
//child 폴더로 이동
count++;
}
}
console.log(count);
//count의 절대값 반환
console.log("current test case end")
return Math.abs(count);
};
위와 같이 최종답변을 submit했지만, 이후 좀 더 나은 방법으로 실행할 수 있는 방법을 알게되어 개선점을 정리해보았다!
Math.abs()
메소드를 사용했던 이유는 parent폴더로 이동하는 경우에 변수count
가 음수가 될 수 있다는 가정 때문이었다.count
의 값을 감소하는 조건을 추가하였고, 본 조건을 추가함으로써 count
가 음수가 되는 경우가 함께 사라졌다.Math.abs()
메소드를 쓰지 않는 편이 더 나은 답변이 된다. count
가 그 역할을 했으나, 처음에 count
를 global scope에 선언해 두번째 test case가 실행되면서 이전 실행결과가 누적이 되어 반환되었다.count
선언문을 minOperations
함수 내부에 옮기고나서 정상실행 할 수 있었다. ❗️변수선언문 위치 주의❗️/\.+\//.test(logs[i]
)을 사용해서 조건을 정의했지만, 똑같은 조건을 /
를 기준으로 .split()
메소드를 이용해 표현할 수도 있다. 반환된 배열의 요소는 각각 인덱스로 가져올 수 있기 때문에 정규표현식을 사용하는 대신에logs[i].split("/")[0] === ".."
로 조건을 대체할 수 있다. Ex)
let a = "../";
let b = a.split("/");
console.log(b); //["..", ""]
console.log(b[0]); //".."
console.log(b[1]); //""