[ 프로그래머스 ] #81303 : 표 편집 - JAVA

🔗 표 편집

문제풀이

  • 문제의 "이름" 은 이해를 위한 것이므로 "index" 로 접근
  • "이동" 은 아래처럼 각 행마다 up, down 배열을 두어 상대적 위치값으로 두도록 함

image

 

1. 삭제

  • 해당열(k)의 up, down 값을 윗행, 아랫행의 값에 넣어줌
  • k행의 up을 아랫행의 up에, k행의 down을 윗행의 down 값으로 함
up[down[k]]=up[k];
down[up[k]]=down[k];
  • 삭제된 행은 복구를 위해 스택에 담음

image

 

2. 복구

  • stack을 pop해서 얻은 행(restore)을 이용해 up, down의 값을 변경
down[up[restore]]=restore;
up[down[restore]]=restore;

image

 

3. 맨 위, 맨 아랫행의 삭제와 복구

  • 위, 아래의 가상으로 공간을 1칸씩 늘려 인덱스가 벗어나지 않고 다룰 수 있도록 함

image

 


 

import java.util.Stack;
import java.util.Arrays;

class Solution {
        // n : 처음 표의 행 개수
        // k : 처음에 선택된 행의 위치
        // cmd : "U X" "D X" "C" "Z"

    public String solution(int n, int k, String[]cmd){
        Stack<Integer> deleted=new Stack<>();
        int [] up=new int[n+2];
        int [] down =new int [n+2];
        // 초기화
        for(int i=0;i<n+2;i++){
            up[i]=i-1;
            down[i]=i+1;
        }
        // 가상 공간으로 인해 현재 위치는 1을 증가시킴
        k++;

        for(String c: cmd){

            // 삭제라면
            if(c.startsWith("C")){
                deleted.push(k);
                up[down[k]]=up[k];
                down[up[k]]=down[k];

                // 마지막 행이라면 k의 윗 정보를 가짐
                k=n<down[k] ? up[k] : down[k];
            }
            // 복원이라면
            else if(c.startsWith("Z")){
                int restore=deleted.pop();
                down[up[restore]]=restore;
                up[down[restore]]=restore;
            }else{
                String []s=c.split(" ");
                int x=Integer.parseInt(s[1]);
                // 이동
                for(int i=0;i<x;i++){
                    k=s[0].equals("U") ? up[k]:down[k];
                }
            }
        }
        // 삭제된 행은 X 로 표시
        char [] answer=new char[n];
        Arrays.fill(answer,'O');

        for(int i:deleted){
            answer[i-1]='X';
        }
        return new String(answer);
    }   
}