[문제 설명]
리눅스의 쉘 명령어가 하는 일을 유사하게 따라 하는 프로그램을 작성하려고 합니다.
다음 세 가지 명령어가 동작하도록 프로그램을 작성해주세요.
1.
이름 | mkdir |
사용 방법 | mkdir directory |
설명 | 특정 위치에 디렉토리를 생성합니다. |
2.
이름 | rm |
사용 방법 | rm directory |
설명 | 특정 디렉토리를 삭제합니다. 삭제한 디렉토리의 하위 디렉토리를 또한 함께 삭제됩니다. |
3.
이름 | cp |
사용 방법 | cp source dest |
설명 | source 디렉토리를 dest로 복사합니다. source 디렉토리의 하위 디렉토리들 또한 복사되어야 합니다. |
위 명령을 수행할 시스템에는 오직 디렉토리만 존재하며, 최상위 디렉토리는 "/"로 표시하고 그 하위 디렉토리는 "/root", "/usr", "/tmp", "/tmp/tmp2"와 같이 구분합니다.
[제한사항]
- directory는 시스템의 디렉토리 구조를 나타내는 문자열 배열입니다.
- directory의 길이는 1 이상 20 이하입니다.
- directory의 원소는 각 디렉토리의 절대 경로(최상위 디렉토리부터의 경로)를 나타냅니다.
- 시스템상의 모든 디렉토리에 대한 결로가 주어집니다.
- 각 디렉토리 이름은 길이가 1 이상 10 이하입니다.
- 경로를 나타내는 문자열은 알파벳 소문자와 '/' 로만 이루어져 있습니다.
- 한 디렉토리 안에 같은 이름의 디렉토리가 두 개 이상 있는 경우는 없으며, 또한 잘못된 경로가 주어지는 경우는 없습니다.
- 디렉토리 경로는 사전 순으로 정렬되어 주어집니다.
- command는 명령어들이 담긴 문자열 배열입니다.
- command의 길이는 1 이상 20 이하입니다.
- commnad의 원소는 쉘 명령어를 나타내는 문자열입니다.
- 문제에 주어진 명령어만 입력으로 주어지며, 잘못된 경로가 주어지는 경우는 없습니다.
- 경로는 항상 절대 경로(최상위 디렉토리부터의 경로)로만 주어집니다.
- cp명령의 경우 자기 자신의 하위 디렉토리에 복사하는 명령은 주어지지 않습니다.
- cp명령의 경우 복사하는 위치에 이름이 동일한 다른 디렉토리가 이미 있는 경우는 주어지지 않습니다.
- "rm/" 명령은 입력으로 주어지지 않습니다.
- rm 명령은 항상 디렉토리 하나를 정상적으로 삭제하는 경우만 입력으로 주어집니다.(존재하지 않거나 잘못된 경로, 없는 디렉토리 등을 삭제하는 경우는 없습니다.)
- mkdir 명령은 항상 디렉토리 하나를 정상적으로 생성하는 경우만 입력으로 주어집니다.(존재하지 않거나 잘못된 경로, 해당 경로에 같은 이름의 디렉토리가 이미 있는 경우, 중간 경로에 해당하는 디렉토리가 없는 경우 등은 입력으로 주어지지 않습니다.)
- 모든 명령어를 수행한 후 디렉토리 구조를 문자열 형태로 배열에 담아 사전 순으로 정렬해서 return 해주세요.
- 입력되는 디렉토리 구조와 마찬가지로, 모든 디렉토리에 대한 절대 경로를 문자열 형태로 담은 뒤 사전 순으로 정렬 해서 return 하면 됩니다.
- '/'가 알파벳보다 사전 순으로 더 앞에 온다고 가정합니다.
[문제]
- 모든 명령어를 수행한 후 디렉토리 구조를 문자열 형태로 배열에 담아 사전 순으로 정렬해서 return 해주세요.
- 입력되는 디렉토리 구조와 마찬가지로, 모든 디렉토리에 대한 절대 경로를 문자열 형태로 담은 뒤 사전 순으로 정렬 해서 return 하면 됩니다.
- '/'가 알파벳보다 사전 순으로 더 앞에 온다고 가정합니다.
[입출력 예]
#1
directory
command
result
#2
directory
command
result
[입출력 예 설명]
- 입력으로 주어진 초기 디렉토리 구성은 다음과 같습니다.
- "mkdir /root/tmp" 명령을 수행한 후 디렉토리 구성은 다음과 같습니다.
- "cp /hello /root/tmp" 명령을 수행한 후 디렉토리 구성은 다음과 같습니다.
- "rm /hello" 명령을 수행한 후 최종 디렉토리 구성은 다음과 같습니다.
입출력 예 #2
명령을 모두 처리한 후 디렉토리 구성은 다음과 같습니다.
[제출답안]
export default function solution(arr) {
/**
* Q1
* expected arr param:
* [
[
"/",
"/hello",
"/hello/tmp",
"/root",
"/root/abcd",
"/root/abcd/etc",
"/root/abcd/hello",
],
["mkdir /root/tmp", "cp /hello /root/tmp", "rm /hello"],
]
* Q2
* expected arr param:
* [
[
"/"
],
[
"mkdir /a",
"mkdir /a/b",
"mkdir /a/b/c",
"cp /a/b /",
"rm /a/b/c"
],
]
*/
let answer = [];
let directories = arr[0];
const COMMANDS = arr[1];
let mkdirCommands = [];
let cpCommands = [];
let rmCommands = [];
COMMANDS.forEach((command) => {
let cmd = command.split(" ")[0];
switch (cmd) {
case "mkdir":
mkdirCommands.push(command.split(" ")[1]);
break;
case "cp":
cpCommands.push(
command.split(" ")[1].concat(" ", command.split(" ")[2])
);
break;
case "rm":
rmCommands.push(command.split(" ")[1]);
break;
}
});
// make directory
if (mkdirCommands.length > 0) {
mkdirCommands.forEach((dir) => {
directories.push(dir);
});
}
// copy direcotry
if (cpCommands.length > 0) {
let tempArry = [];
cpCommands.forEach((cmds) => {
let dirCopyFrom = cmds.split(" ")[0];
let dirCopyTo = cmds.split(" ")[1];
for (let i = 0; i < directories.length; i++) {
if (directories[i].startsWith(dirCopyFrom)) {
if (dirCopyTo === "/") {
tempArry.push("".concat(directories[i]));
} else {
tempArry.push(dirCopyTo.concat(directories[i]));
}
}
}
});
directories = directories.concat(tempArry);
}
// remove directory
if (rmCommands.length > 0) {
rmCommands.forEach((dir) => {
for (let i = 0; i < directories.length; i++) {
if (directories[i].startsWith(dir)) {
directories.splice(i, 1);
i--;
}
}
});
}
answer = [...new Set(directories)]; // remove duplicates if exist
return answer;
}
'Algorithm Test' 카테고리의 다른 글
포켓몬 선택 (0) | 2022.10.26 |
---|---|
기능개발 (0) | 2022.10.25 |
재정렬 배열 반환 (0) | 2022.08.16 |
입출금 response code 반환 (0) | 2022.08.16 |
신규 아이디 추천 (0) | 2022.07.18 |