코딩테스트/프로그래머스

[Java] 프로그래머스 - 표 편집 (3단계)

배똥회장 2022. 6. 15. 09:48
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? X
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 표 편집

8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z"] "OOOOXOOO" 8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"] "OOXOXOOO"

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    public String solution(int n, int k, String[] cmd) {
    	//삭제됬는지 안됬는지를 확인할 배열
        boolean[] list = new boolean[n];
        //처음에는 모두 있기 때문에 true로 설정함
        Arrays.fill(list, true);
        
        //위치 파악을 위한 index 변수 선언
        int index = k;
        
        //삭제된 위치들 모을 stack도 선언
        Stack<Integer> delete = new Stack<>();
        
        //위로든 아래로든 움직이는 것을 선언할 때마다 움직일 필요가 없고
        //삭제나 돌아가기가 호출 될 때 움직임을 모았다가 움직이면 되기 때문에
        //따로 모아놓을 변수 선언
        int moveCount = 0;
        
        
        //cmd 순서대로 돌기 위해서 for문
        for (int i = 0; i < cmd.length; i++) {
        	//cmd[i]를 띄어쓰기 기준으로 나눠서 String 배열 만들기
            String[] s = cmd[i].split(" ");
            //문자 비교를 위해 String으로 하기 보단 char로 하기 위해서 char로 형 변환
            char key = s[0].charAt(0);
            //움직이는 숫자를 파악하기 위해 만약 s가 1보다 길면 숫자 변환하고 아님 0 넣기
            int count = s.length > 1 ? Integer.parseInt(s[1]) : 0;
            
            if (key == 'U') { //만약 U이면 위로 움직여야 하기 때문에 moveCount에선 빼기
                moveCount -= count;
            } else if (key == 'D') { //만약 D이면 아래로 움직여야 하기 때문에 더하기
                moveCount += count;
            } else if (key == 'C') { //C이면
            	//move함수 호출해서 index 위치 움직이기
                index = move(list, index, moveCount);
                //moveCount는 움직였기 때문에 0으로 리셋
                moveCount = 0;
                //현 위치인 index를 삭제해야 하기 때문에 false로 변경
                list[index] = false;
                //삭제된 위치는 스택에 넣기
                delete.push(index);
                //그리고 현 위치에 있으면 안되고 아래로 한 칸 이동해야 하기 때문에 next함수 호출
                index = next(list, index);
            } else if (key == 'Z') { //만약 Z이면
            	//현재 위치 다시 수정하고,
                index = move(list, index, moveCount);
                moveCount = 0;
                //스택에서 제일 마지막에 넣은 값을 꺼내와서
                int reset = delete.pop();
                //해당 위치의 값 다시 true로 변환
                list[reset] = true;
            }
        }
        
        //String으로 붙이면 시간 많이 잡아 먹어서 StringBuilder로 추가한 후 toString()으로 문자열 변환
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.length; i++) {
            if (list[i]) sb.append("O"); else sb.append("X");
        }
        
        return sb.toString();
    }
    
    public int next(boolean[] list, int index) {
    	//일단 아래로 내려가서 삭제되지 않는 값이 있다면 그 위치로 리턴
        for (int i = index+1; i < list.length; i++) {
            if (list[i]) return i;
        }
        
        //아래로 내려가도 리턴되지 않으면 위로 올라가기
        for (int i = index-1; i >= 0; i--) {
            if (list[i]) return i;
        }
        
        return index;
    }
    
    public int move(boolean[] list, int index, int num) {
        if (num > 0) { //만약 num이 0보다 크면 아래로 내려가야하기 때문에
            for (int i = index+1; i < list.length; i++) {
                if (num == 0) break;
                if (list[i]) num--;
                index++;
            }
        } else {
            for (int i = index-1; i >= 0; i--) {
                if (num == 0) break;
                if (list[i]) num++;
                index--;
            }
        }
        
        return index;
    }
}

 

정확성 테스트
테스트 1 통과 (0.19ms, 79MB)
테스트 2 통과 (0.22ms, 70.3MB)
테스트 3 통과 (0.26ms, 72.8MB)
테스트 4 통과 (0.30ms, 77.4MB)
테스트 5 통과 (0.37ms, 73.6MB)
테스트 6 통과 (0.41ms, 75.7MB)
테스트 7 통과 (0.38ms, 73.8MB)
테스트 8 통과 (0.36ms, 73.4MB)
테스트 9 통과 (0.40ms, 73.2MB)
테스트 10 통과 (0.36ms, 76MB)
테스트 11 통과 (1.47ms, 77.4MB)
테스트 12 통과 (1.45ms, 84.6MB)
테스트 13 통과 (1.59ms, 76.9MB)
테스트 14 통과 (1.69ms, 78MB)
테스트 15 통과 (1.71ms, 79.4MB)
테스트 16 통과 (1.55ms, 78.5MB)
테스트 17 통과 (3.83ms, 78.2MB)
테스트 18 통과 (3.29ms, 73MB)
테스트 19 통과 (2.54ms, 78.3MB)
테스트 20 통과 (2.73ms, 76.5MB)
테스트 21 통과 (2.10ms, 65.5MB)
테스트 22 통과 (2.11ms, 87.3MB)
테스트 23 통과 (0.19ms, 78.9MB)
테스트 24 통과 (0.19ms, 73.7MB)
테스트 25 통과 (0.31ms, 77.5MB)
테스트 26 통과 (0.20ms, 73MB)
테스트 27 통과 (0.23ms, 77.6MB)
테스트 28 통과 (0.27ms, 74.3MB)
테스트 29 통과 (0.26ms, 78.3MB)
테스트 30 통과 (0.25ms, 71.9MB)
 
효율성 테스트
테스트 1 통과 (142.42ms, 103MB)
테스트 2 통과 (170.62ms, 105MB)
테스트 3 통과 (154.68ms, 103MB)
테스트 4 통과 (219.28ms, 108MB)
테스트 5 통과 (219.50ms, 108MB)
테스트 6 통과 (192.67ms, 109MB)
테스트 7 통과 (201.03ms, 94.3MB)
테스트 8 통과 (988.62ms, 96.3MB)
테스트 9 통과 (205.97ms, 110MB)
테스트 10 통과 (218.83ms, 110MB)

 

 

 

 

 

 

728x90