-
[프로그래머스] 표 편집코딩테스트 문제풀이 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
'코딩테스트 문제풀이' 카테고리의 다른 글
[백준 17478] 재귀함수가 뭔가요? (1) 2021.12.14 [백준 10870] 피보나치 수 5 (1) 2021.12.14 [프로그래머스] 다단계 칫솔 판매 (0) 2021.10.12 [백준 1931] 회의실 배정 - 그리디 알고리즘 (0) 2021.10.12 [백준 1920] 수찾기 - 이분탐색 (0) 2021.10.07