코딩테스트 문제풀이
[프로그래머스] 표 편집
지잉지잉
2021. 10. 14. 23:20
문제
풀이
import java.util.*;
class Solution {
private static final char UP = 'U';
private static final char DOWN = 'D';
private static final char CUT = 'C';
private static final char RESTORE = 'Z';
public String solution(int n, int k, String[] cmd) {
Stack<Node> deletedNode = new Stack<Node>();
Node root = new Node(0);
Node currentNode = root;
for (int i = 1; i < n; i++) {
Node node = new Node(i);
currentNode.setNext(node);
node.setPrevious(currentNode);
currentNode = node;
}
Node end = currentNode;
currentNode = root;
while (k-- > 0) {
currentNode = currentNode.getNext();
}
int cmdLength = cmd.length;
for (int i = 0; i < cmdLength; i++) {
char c = cmd[i].charAt(0);
if (c == UP) {
int moveCount = Integer.parseInt(cmd[i].substring(2));
for (int j = 0; j < moveCount; j++) {
currentNode = currentNode.getPrevious();
}
} else if (c == DOWN) {
int moveCount = Integer.parseInt(cmd[i].substring(2));
for (int j = 0; j < moveCount; j++) {
currentNode = currentNode.getNext();
}
} else if (c == CUT) {
deletedNode.add(currentNode);
if (currentNode == root) {
currentNode = currentNode.getNext();
currentNode.setPrevious(null);
root = currentNode;
} else if (currentNode == end) {
currentNode = currentNode.getPrevious();
currentNode.setNext(null);
end = currentNode;
} else {
currentNode.getPrevious().setNext(currentNode.getNext());
currentNode.getNext().setPrevious(currentNode.getPrevious());
currentNode = currentNode.getNext();
}
} else { // restore
Node deleted = deletedNode.pop();
if (deleted.getPrevious() == null) {
root = deleted;
root.getNext().setPrevious(root);
} else if (deleted.getNext() == null) {
end = deleted;
end.getPrevious().setNext(end);
} else {
deleted.getNext().setPrevious(deleted);
deleted.getPrevious().setNext(deleted);
}
}
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < n; i++) {
if (root != null && root.getData() == i) {
sb.append("O");
root = root.getNext();
} else {
sb.append("X");
}
}
return sb.toString();
}
class Node {
private Node previous;
private Node next;
private int data;
public Node(int data) {
this.data = data;
previous = null;
next = null;
}
public Node getPrevious() {
return previous;
}
public void setPrevious(Node previous) {
this.previous = previous;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
}
- 연결리스트를 이용한 문제풀이
- Node 객체를 만들어서 next, previous로 모든 노드들을 연결해 준다.
- 삭제 및 복원시 next, previous 노드가 바뀌면서 추가/삭제 된다.
출처: https://programmers.co.kr/learn/courses/30/lessons/81303