문제 링크
https://leetcode.com/problems/simplify-path/
풀이
전체적인 풀이 과정은 다음과 같다.
- 주어진 path를 "/" 바탕으로 분리
- 최종 경로를 만들 StringBuilder와 경로에 담을 디렉토리 이름을 담아놓을 LinkedList 생성
- 주어진 path를 분리한 문자열 배열을 돌며 작업
1) 해당 디렉토리 명이 공백이거나, "."이 아닌 ".."이라면, 기존에 디렉토리를 담아놓는 LinkedList에서 마지막 요소를 제거(존재한다면)
2) 그 외엔 일반적으로 LinkedList에 해당 요소 추가 - LinkedList를 돌며 저장된 문자열들을 "/"로 구분지으며 추가
- 최상위 경로 "/"를 제외한 경로들에 대해선 마지막 "/" 제거 후 반환
단순한 구현 문제로, 주어진 경로를 명확한 절대 경로로 변환하면 되는 문제이다. 실제 디렉토리 구조처럼 "."인 경우는 현재 위치를, ".."인 경우는 부모 위치 경로를 나타내기 때문에, "." 이라면 단순히 해당 부분을 무시하면 되고, ".."이 주어진 다면 해당 요소를 없애기 위해 앞서 존재하는 부모 디렉토리 문자열을 제거해주면 된다.
이를 위해 우선 주어진 path를 "/" 기반으로 분리하여 문자열 배열을 생성하고, 최종 절대 경로를 만들기 위한 StringBuilder(초기값 "/")와 절대 경로에 포함될 문자열들을 저장할 LinkedList를 초기화한다. 이후 문자열 배열을 돌며, 해당 문자열이 공백이거나 "."인 경우를 제외하고 작업을 계속한다. 만약 문자열이 ".."이라면 기존 LinkedList에 마지막으로 추가된 문자열을 추가로 제거해주는 과정을 거치고, 그 외의 일반적인 경로라면 단순히 LinkedList에 해당 경로를 추가한다.
그 다음엔 완성된 LinkedList를 돌면서 경로를 만들어주면 되는데, 단순히 해당 문자열과 구분자 "/"를 넣어주면 된다. 이후 완성된 경로에 대해서, 단순 최상위 경로 "/"가 아니라면 규칙에 맞게 마지막 구분자를 제거한 후 반환해주면 된다.
class Solution {
public String simplifyPath(String path) {
String[] dirNames = path.split("/");//path 분리
StringBuilder canonicalPath = new StringBuilder("/");
LinkedList<String> candidates = new LinkedList<>();
for(int i=0;i<dirNames.length;i++){
if(!dirNames[i].equals("")&&!dirNames[i].equals(".")){//공백이거나 "."이 아니라면
if(dirNames[i].equals("..")){//".."인 경우
if(candidates.size()!=0){//앞의 경로가 있다면 해당 경로도 제거
candidates.removeLast();
}
}else{//일반적인 경로라면 추가
candidates.add(dirNames[i]);
}
}
}
for(int i=0;i<candidates.size();i++){//구분자 "/"를 추가한 경로 연결
canonicalPath.append(candidates.get(i)).append("/");
}
if(canonicalPath.length()!=1){//마지막 구분자 제거
canonicalPath.deleteCharAt(canonicalPath.length() - 1);
}
return canonicalPath.toString();
}
}
결과
'Algorithm > 코드 풀이' 카테고리의 다른 글
LeetCode: 74번 (Search a 2D Matrix) [JAVA] (0) | 2023.05.23 |
---|---|
LeetCode: 72번 (Edit Distance) [JAVA] (0) | 2023.05.23 |
LeetCode: 68번 (Text Justification) [JAVA] (0) | 2023.05.01 |
프로그래머스: 요격 시스템 [JAVA] (0) | 2023.04.23 |
LeetCode: 65번 (Valid Number) [JAVA] (0) | 2023.04.23 |