🔗 표 편집
문제풀이
- 문제의 "이름" 은 이해를 위한 것이므로 "index" 로 접근
- "이동" 은 아래처럼 각 행마다
up
,down
배열을 두어 상대적 위치값으로 두도록 함
1. 삭제
- 해당열(k)의
up
,down
값을 윗행, 아랫행의 값에 넣어줌 k
행의up
을 아랫행의up
에,k
행의down
을 윗행의down
값으로 함
up[down[k]]=up[k];
down[up[k]]=down[k];
- 삭제된 행은 복구를 위해 스택에 담음
2. 복구
- stack을 pop해서 얻은 행(
restore
)을 이용해up
,down
의 값을 변경
down[up[restore]]=restore;
up[down[restore]]=restore;
3. 맨 위, 맨 아랫행의 삭제와 복구
- 위, 아래의 가상으로 공간을 1칸씩 늘려 인덱스가 벗어나지 않고 다룰 수 있도록 함
import java.util.Stack;
import java.util.Arrays;
class Solution {
// n : 처음 표의 행 개수
// k : 처음에 선택된 행의 위치
// cmd : "U X" "D X" "C" "Z"
public String solution(int n, int k, String[]cmd){
Stack<Integer> deleted=new Stack<>();
int [] up=new int[n+2];
int [] down =new int [n+2];
// 초기화
for(int i=0;i<n+2;i++){
up[i]=i-1;
down[i]=i+1;
}
// 가상 공간으로 인해 현재 위치는 1을 증가시킴
k++;
for(String c: cmd){
// 삭제라면
if(c.startsWith("C")){
deleted.push(k);
up[down[k]]=up[k];
down[up[k]]=down[k];
// 마지막 행이라면 k의 윗 정보를 가짐
k=n<down[k] ? up[k] : down[k];
}
// 복원이라면
else if(c.startsWith("Z")){
int restore=deleted.pop();
down[up[restore]]=restore;
up[down[restore]]=restore;
}else{
String []s=c.split(" ");
int x=Integer.parseInt(s[1]);
// 이동
for(int i=0;i<x;i++){
k=s[0].equals("U") ? up[k]:down[k];
}
}
}
// 삭제된 행은 X 로 표시
char [] answer=new char[n];
Arrays.fill(answer,'O');
for(int i:deleted){
answer[i-1]='X';
}
return new String(answer);
}
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[ etc ] #15 : 요세푸스 문제 - JAVA (0) | 2025.04.12 |
---|---|
[ 프로그래머스 ] #42747 : H-Index - JAVA (0) | 2025.04.07 |
[ 프로그래머스 ] #42587 : 프로세스 - JAVA (1) | 2025.04.05 |
[ 프로그래머스 ] #42583 : 다리를 지나는 트럭 - JAVA (1) | 2025.04.03 |
[ 프로그래머스 ] #64061 : 크레인 인형뽑기 게임 - JAVA (0) | 2025.04.02 |