프로그래머스 Level3

남기현·2022년 2월 6일
0

프로그래머스

목록 보기
1/3
post-thumbnail

✅ 표 편집

문제링크

📌 문제설명

요약하자면 U, D, C, Z의 명령어를 기반으로 행을 삭제하고 되돌린 값과 수정되기 전의 처음 값과 비교하여 return 하는 문제였다.

📌 문제풀이

😺 GitHub 바로가기

▪ 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라고 착각해서 문제 풀다가

😶😶😶😶😶❓❓❓❔❔❗,,,하,,,,,,🕑
코드 갈아엎고 다시 작성했다ㅎㅎㅎㅎㅎ👿👿

📌 결과

👍👍👍
profile
내가 보려고 만든 velog

0개의 댓글