<Medium> Simplify Path (LeetCode : C#)

이도희·2023년 4월 21일
0

알고리즘 문제 풀이

목록 보기
61/185

https://leetcode.com/problems/simplify-path/

📕 문제 설명

Unix 파일 시스템의 절대 경로가 주어질 때 상대 경로로 변경해서 반환하기

. : 현재 폴더
.. : 이전 폴더 (up level)
... : file/directory name

상대 경로
1) /로 시작
2) 두 폴더는 /로 구분됨
3) 끝이 /로 나지 않음
4) period 포함 안함

  • Input
    절대 경로
  • Output
    변환된 상대 경로

예제

풀이

절대 경로에만 나타나는 케이스들을 분기점으로 두고 케이스에 맞게 동작하도록 작성했다.

  1. 절대 경로를 /를 기준으로 Split 하여 operation과 폴더 명만 담긴 배열을 만든다.
  2. .. operation이 왔을 때 이전 폴더로 돌아가도록 하기 위해 Stack으로 관리한다.
  3. 절대 경로 배열을 돌면서 ..을 만나고 스택에 쌓인 요소 개수가 1개 이상이면 pop하여 이전 폴더를 가리키도록 한다.
  4. operation case들이 아닌 폴더 명을 만나면 스택에 쌓아준다.
  5. stack을 거꾸로 돌면서 /와 폴더 명을 더해 최종 상대 경로를 return해준다.
public class Solution {
    public string SimplifyPath(string path) {

        string[] absolutePath = path.Split('/');
        Stack<string> canonicalPath = new Stack<string>();
        string answer = "";

        foreach(string directory in absolutePath)
        {
            if (directory == "" || directory == ".") continue;
            // stack pop (.. operation + 현재 스택에 뭐가 담겨 있을 때)
            else if (directory == ".." && canonicalPath.Count > 0) canonicalPath.Pop();
            // stack push
            else if (directory != "..") canonicalPath.Push(directory);;
        }

        if (canonicalPath.Count == 0) return "/";

        List<string> answerList = canonicalPath.ToList();
        answerList.Reverse();

        foreach(string directory in answerList) // 최종 결과로 변환
        {
            answer += "/";
            answer += directory;
        }

        return answer;
        
    }
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글