코딩테스트/프로그래머스
[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