✔문제링크
요약하자면 U, D, C, Z의 명령어를 기반으로 행을 삭제하고 되돌린 값과 수정되기 전의 처음 값과 비교하여 return 하는 문제였다.
▪ C명령어시 담아줄 스택 (Z명령어로 인해 값을 다시 되돌려야하기 때문에 스택구조 사용)
▪ 행의 삭제 및 되돌리기시 전체 행의 크기 구분
▪ U,D,C,Z 분기
import java.util.Stack;
class Solution {
public String solution(int n, int k, String[] cmd) {
String answer = "";
//z시 담아줄 스택 선언(push,pop을 통해 index를 담아줄 예정)
Stack<Integer> zCmd = new Stack<>();
//z,c로 인해 행이 삭제되고 추가되어 행의 전체 크기를 나타내기 위한 변수 선언
int indexMaxSize = n;
//문자열 쌓기 위한 변수 선언
StringBuilder sBuilder = new StringBuilder();
//수행 명령길이 만큼
for(int i=0; i<cmd.length; i++){
//아래 이동
if(cmd[i].substring(0,1).equals("D")){
k=k+Integer.parseInt(cmd[i].substring(2));
//위로 이동
}else if(cmd[i].substring(0,1).equals("U")){
k=k-Integer.parseInt(cmd[i].substring(2));
//삭제
}else if(cmd[i].substring(0,1).equals("C")){
//스택에 값 담기
zCmd.push(k);
//삭제로 인한 전체 행크기 -1
--indexMaxSize;
//마지막행 삭제일 경우 포커스 되어있는 윗행 포커스
if(k==indexMaxSize) k--;
//되돌리기
}else if(cmd[i].substring(0,1).equals("Z")){
//되돌리기로 인한 전체 행크기 +1
indexMaxSize++;
//되돌린행이 포커스되어있는 행보다 작은 경우 한칸 밀리게 되므로 +1
if(zCmd.pop()<=k) k++;
}
}
//마지막 사이즈의 행크기 만큼 0 append
for(int i=0; i<indexMaxSize; i++){
sBuilder.append("O");
}
//스택 크기
int sSize = zCmd.size();
//스택 크기 만큼 추가(스택에는 z시 포커스되어있던 index가 담겨 있음)
for(int i=0; i<sSize; i++){
sBuilder.insert(zCmd.pop(), "X");
}
answer=sBuilder.toString();
return answer;
}
}
❌
처음에는 StringBuilder 함수를 사용하지 않고
//행의 갯수만큼 배열을 만들어준다.
//아래 배열에서 z명령어시 x로 치환 예정.
String[] nParam = new String[n];
for(int a=0; a<n; a++){
nParam[a] = "O";
}
파라미터로 받은 행의 크기만큼 직접 배열을 선언하고 C, Z 명령어 시 직접 "O"와 "X"로 치환하여 return 하였는데 매 명령어마다 바라보고 있는 행 k를 선언해 주는 부분이 자꾸 헷갈려서 다 빼버리고 Z, C 명령어마다 스택에 지워지고 추가되는 값만 추가했다.
결정적으로는 마지막에 최종 배열을 string으로 바꿨을 때 [ O, X, O, O, X, O] 이런 식으로 나와서 replace나 다른 함수를 통해 또 OXOOXO와 같은 형식으로 바꿔줘야 할 거 같아서 좀 더 편한 함수를 찾던 중 StringBuilder를 알게 되었고 바로 적용했다. 코드가 훨씬 더 직관적으로 바뀌어서 아주 편안했다.
❌
값을 저장하는 스택도 처음에는 배열로 선언했는데 예를 들어 배열에 [1, 4, 5, 7, 3] 과 같은 배열 값이 저장되어 있을 때 Z 명령어로 인해 3이 되돌아갔을 때 배열을 다시 [1, 4, 5, 7]의 값으로 바꿔 줘야 하는데 마지막 배열 삭제 코드가 너무 더러워져서 스택으로 다시 바꿨다.
❌
문제가 0-무지, 1-콘, 2-어피치 이런 식으로 되어 있어서 앞에 있는 인덱스를 키값으로 생각하고 무지, 콘,어피치를 고정 value라고 착각해서 문제 풀다가