말랑한 하루

[Programmers] 표 편집 (Lv 3, JavaScript) 본문

문제풀이/Programmers

[Programmers] 표 편집 (Lv 3, JavaScript)

지수는말랑이 2022. 12. 18. 18:14
반응형

[ 학습 내용 ]
1. 노드를 생성하는법

2. 노드연결리스트를 생성하는 법

3. 노드를 삭제하는 법

4. 노드를 되돌리는 법

[ 소스 코드 ]

function solution(n, k, cmd) {
    // Link Node 생성, 생성시 화살표함수 표기법 불가능
    const Node = function (index, prev) {
        this.index = index;
        this.prev = prev;
        this.next = null;
    }
    
    let prevNode = new Node(0);
    let select;
    
    // LinkedList 생성
    for(let i=1; i<n; i++) {
        const tempNode = new Node(i, prevNode);
        // 이전노드의 꼬리를 현재노드와 연결
        prevNode.next = tempNode;
        // 연결이 완료된 후 이전노드 갱신
        prevNode = tempNode;
        
        // 처음 선택될 노드 저장
        if (i === k) select = tempNode;
    }
    
    // 노드 삭제 대기 공간
    let deleteBin = [];
    
    // 명령어 U, D
    const selectNode = (cnt, dir) => {
        for(let i=0; i<cnt; i++) {
            // LinkedList의 처음이거나 끝인경우
            if (!select[dir]) break;
            select = select[dir];
        }
    }
    
    const deleteNode = () => {
        const prev = select.prev;
        const next = select.next;
        
        deleteBin.push(select);
        
        // 삭제 후 아래행 선택, 마지막 행인 경우 윗행 선택
        select = next ? next : prev;
        
        // 삭제 후 이전노드 갱신
        if (prev) prev.next = next;
        // 삭제 후 이후노드 갱신
        if (next) next.prev = prev;
    }
    
    const restoreNode = () => {
        const storeNode = deleteBin.pop();
        
        const prev = storeNode.prev;
        const next = storeNode.next;
        
        if (prev) prev.next = storeNode;
        if (next) next.prev = storeNode;
    }
    
    cmd.forEach((cm) => {
        const [type, option] = cm.split(" ");
        switch(type) {
            case "U":
                selectNode(option, "prev");
                break;
            case "D":
                selectNode(option, "next");
                break;
            case "C":
                deleteNode();
                break;
            case "Z":
                restoreNode();
                break;
        }
    })
    
    let answer = new Array(n).fill("O");
    deleteBin.forEach((node) => answer[node.index] = "X");
    return answer.join("");
}
반응형
Comments