Java/프로그래머스

[프로그래머스 / Java] Lv3. 표편집

동구름이 2025. 1. 19. 21:51

문제

https://school.programmers.co.kr/learn/courses/30/lessons/81303

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

세 가지 변수를 잘 관리하는 것이 포인트이다.

 

1. 현재 컬럼의 위치를 나타내는 정수형 `cur`

2. 현재 표의 전체 크기를 나타내는 정수형 `size`

3. 삭제한 컬럼의 위치를 보관하는 스택 자료구조인 `deque` (자바에서는 stack이 레거시 자료구조라 deque로 구현함)

 

 

그리고 명령어에 따른 동작은 크게 세 가지 메서드로 구현했다.

 

1. moveColumn()

방향에 따라 현재 컬럼 위치(`cur`)를 이동한다.

 

2. deleteColumn()

행을 삭제한다.

 

표에서 행이 하나 없어지는 것이기 때문에, size도 하나 줄인다.

삭제한 행의 위치는 복구를 위해 stack에 저장한다.

 

3. recoverColumn()

행을 복구한다.

 

stack은 LIFO이기 때문에 pop을 통해 마지막 값을 복구할 수 있다. 행이 복구되었기 때문에 size를 다시 늘린다.

현재 포인터의 위치와 비교해서 cur 값보다 아래의 값이 들어오면 cur를 ++한다.

 

 

 

 

이제 `size`, `stack` 자료구조를 이용해 결과 문자열을 만들 수 있다.

 

1. size 만큼 "O"으로 채운다.

2. stack에서 pop을 하며 해당 인덱스를 "X"로 채운다.

 

쉽게 생각해, `삭제한 행들의 인덱스`만 기억하면 결과 문자열을 만들어낼 수 있다.

 

 

소스 코드

import java.util.*;

class Solution {
    
    static ArrayDeque<Integer> deque = new ArrayDeque<>();
    static int cur;
    static int size;
    
    public String solution(int n, int k, String[] cmd) {
        String answer = "";
        cur = k;
        size = n;
        
        for(String command:cmd){
            String[] str = command.split(" ");
            String control = str[0];
            switch(control){
                case "U": 
                    moveColumn(str);
                    break;
                case "D": 
                    moveColumn(str);
                    break;
                case "C":
                    deleteColumn();
                    break;
                case "Z":
                    recoverColumn();
                    break;
            }
        }
        
        answer = buildResult();
        return answer;
    }
    
    static void moveColumn(String[] str){
        String control = str[0];
        int X = Integer.valueOf(str[1]);
        if (control.equals("D")) {
            cur += X;
        }
        if (control.equals("U")) {
            cur -= X;
        }
    }
    
    static void deleteColumn(){
        deque.push(cur);
        size--;
        if(cur==size) cur--;
    }
    
    static void recoverColumn(){
        int value = deque.pop();
        if(value<=cur) cur++;
        size++;
    }
    
    static String buildResult(){
        StringBuilder sb = new StringBuilder();
        
        for(int i=0; i<size; i++) sb.append("O");
        while(!deque.isEmpty()){
            sb.insert(deque.pop(), "X");
        }
        
        return sb.toString();
    }
    
}