문제
https://school.programmers.co.kr/learn/courses/30/lessons/81303
풀이
세 가지 변수를 잘 관리하는 것이 포인트이다.
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();
}
}
'Java > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2. 메뉴 리뉴얼 (0) | 2024.06.11 |
---|---|
[프로그래머스] Lv 1. 키패드 누르기 (1) | 2024.05.31 |