
https://school.programmers.co.kr/learn/courses/30/lessons/81303
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이 문제는 테이블에서 행을 선택하고 이동하거나 삭제 및 복원을 처리하는 문제다.
각 명령어를 수행하며 최종적으로 테이블의 상태를 반환한다.
테이블 크기가 크고,
명령어의 수가 많더라도 스택을 활용해 빠르게 동작하도록 설계했다.
먼저 TableEditor라는 클래스를 만들어 테이블의 크기와 현재 커서 위치를 관리한다.
tableSize는 현재 활성화된 테이블의 총 행 수를,
cursor는 현재 커서가 위치한 행을,
removed는 삭제된 행의 정보를 저장하는 스택이다.
이 구조를 통해 삭제된 행을 복원하거나,
커서를 효율적으로 이동할 수 있다.
TableEditor class 의 기능
커서 이동: moveDown과 moveUp 메서드는 커서를 아래 또는 위로 이동한다. 이동 시 테이블 범위를 벗어나지 않도록 최소값과 최대값을 사용해 제한을 둔다.
행 삭제: delete 메서드는 현재 커서가 위치한 행을 삭제하고 스택에 저장한다. 삭제 후 테이블 크기를 줄이며, 삭제된 행이 마지막 행이었다면 커서를 한 칸 위로 이동시킨다.
행 복원: restore 메서드는 삭제된 행을 복원한다. 스택에서 삭제된 행의 인덱스를 꺼내 복원하며, 복원된 행이 현재 커서보다 앞에 있다면 커서를 한 칸 아래로 조정한다.
결과 출력: getResult 메서드는 테이블의 상태를 문자열로 반환한다. 남아 있는 행은 'O', 삭제된 행은 'X'로 표시된다. 삭제된 행은 스택에 저장된 순서대로 복원되므로, 이를 활용해 최종 결과를 효율적으로 구성한다.
solution 메서드는 TableEditor 객체를 생성하고,
입력된 명령어 배열을 순회하며 각 명령어를 processCommand 메서드로 처리한다.
명령어는 'D x'(아래로 x칸 이동), 'U x'(위로 x칸 이동), 'C'(삭제), 'Z'(복원)
네 가지로 구성되어 있으며,
각 명령어에 따라 적절한 메서드를 호출한다.
모든 명령어가 처리되면 getResult를 호출해 최종 테이블 상태를 반환한다.
import java.util.Stack;
class TableEditor {
private int tableSize;
private int cursor;
private Stack<Integer> removed;
public TableEditor(int n, int k) {
this.tableSize = n;
this.cursor = k;
this.removed = new Stack<>();
}
public void moveDown(int x) {
cursor = Math.min(cursor + x, tableSize - 1);
}
public void moveUp(int x) {
cursor = Math.max(cursor - x, 0);
}
public void delete() {
removed.push(cursor);
tableSize--;
if (cursor == tableSize) {
cursor--;
}
}
public void restore() {
int restoredIndex = removed.pop();
if (restoredIndex <= cursor) {
cursor++;
}
tableSize++;
}
public String getResult() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < tableSize; i++) {
builder.append("O");
}
while (!removed.isEmpty()) {
builder.insert(removed.pop(), "X");
}
return builder.toString();
}
public void processCommand(String cmd) {
char type = cmd.charAt(0);
if (type == 'D') {
moveDown(Integer.parseInt(cmd.substring(2)));
} else if (type == 'U') {
moveUp(Integer.parseInt(cmd.substring(2)));
} else if (type == 'C') {
delete();
} else if (type == 'Z') {
restore();
}
}
}
class Solution {
public String solution(int n, int k, String[] cmd) {
TableEditor editor = new TableEditor(n, k);
for (String command : cmd) {
editor.processCommand(command);
}
return editor.getResult();
}
}
'Algorithm & Data Structures > Programers' 카테고리의 다른 글
Lv 2. 두 원사이의 정수 쌍 (0) | 2025.01.11 |
---|---|
Lv 2. 혼자서 하는 틱택토 (0) | 2025.01.09 |
Lv 2. N-Queen (1) | 2025.01.03 |
Lv 2. 과제 진행하기 (1) | 2024.12.30 |
Lv3. 인사고과 (0) | 2024.12.26 |