728x90
https://programmers.co.kr/learn/courses/30/lessons/81303
코딩테스트 연습 - 표 편집
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
문제
- "U X": 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.
- "D X": 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.
- "C" : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.
- "Z" : 가장 최근에 삭제된 행을 원래대로 복구합니다. 단, 현재 선택된 행은 바뀌지 않습니다.
처음 표의 행 개수를 나타내는 정수 n, 처음에 선택된 행의 위치를 나타내는 정수 k, 수행한 명령어들이 담긴 문자열 배열 cmd가 매개변수로 주어질 때, 모든 명령어를 수행한 후 표의 상태와 처음 주어진 표의 상태를 비교하여 삭제되지 않은 행은 O, 삭제된 행은 X로 표시하여 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
제한사항
- 5 ≤ n ≤ 1,000,000
- 0 ≤ k < n
- 1 ≤ cmd의 원소 개수 ≤ 200,000
- cmd의 각 원소는 "U X", "D X", "C", "Z" 중 하나입니다.
- X는 1 이상 300,000 이하인 자연수이며 0으로 시작하지 않습니다.
- X가 나타내는 자연수에 ',' 는 주어지지 않습니다. 예를 들어 123,456의 경우 123456으로 주어집니다.
- cmd에 등장하는 모든 X들의 값을 합친 결과가 1,000,000 이하인 경우만 입력으로 주어집니다.
- 표의 모든 행을 제거하여, 행이 하나도 남지 않는 경우는 입력으로 주어지지 않습니다.
- 본문에서 각 행이 제거되고 복구되는 과정을 보다 자연스럽게 보이기 위해 "이름" 열을 사용하였으나, "이름"열의 내용이 실제 문제를 푸는 과정에 필요하지는 않습니다. "이름"열에는 서로 다른 이름들이 중복없이 채워져 있다고 가정하고 문제를 해결해 주세요.
- 표의 범위를 벗어나는 이동은 입력으로 주어지지 않습니다.
- 원래대로 복구할 행이 없을 때(즉, 삭제된 행이 없을 때) "Z"가 명령어로 주어지는 경우는 없습니다.
- 정답은 표의 0행부터 n - 1행까지에 해당되는 O, X를 순서대로 이어붙인 문자열 형태로 return 해주세요.
정확성 테스트 케이스 제한 사항
- 5 ≤ n ≤ 1,000
- 1 ≤ cmd의 원소 개수 ≤ 1,000
풀이
처음 풀 때는 링크드리스트와 스택을 이용할려고 했으나 계속 시간초과가 나서 고민하다가 다른분의 풀이를 참고 하면서 풀다보니 굳이 링크드리스트를 사용하지 않고 Z의 기능만 스택으로 구현해주고 푸는 방법으로 풀어보게되었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import java.util.Stack;
public class EditTable {
public String solution(int n, int k, String[] cmd) {
//삭제 된 값을 순서대로 저장할 스택
Stack<Integer> remove_val = new Stack<>();
int table_size = n;
for(int i = 0; i < cmd.length; i++){
char c = cmd[i].charAt(0);
//D면 정수형으로 변환해서 +
if (c == 'D'){
k+= Integer.parseInt(cmd[i].substring(2));
}
//U면 정수형으로 변환해서 -
else if (c == 'U'){
k-=Integer.parseInt(cmd[i].substring(2));
}
//C면 정수형으로 변환해서 삭제스택에다가 현재 포커스값을 넣는다.그다음 테이블 사이즈 줄여줌
else if (c == 'C'){
remove_val.add(k);
table_size --;
//만약 k값이 마지막위치에 있다면 k값을 빼준다.
if (k == table_size){
k--;
}
//Z이면 스택에서 값을 빼낸다 만약 K값이 스택에서 나온값과 같다면 k++
}else if (c == 'Z'){
if (remove_val.pop()<=k){
k++;
}
//표 사이즈 늘려줌
table_size++;
}
}
StringBuilder sb = new StringBuilder();
//현재 표 크기만큼 0을 채워넣는다.
for(int i = 0; i<table_size; i++){
sb.append("O");
}
//스택에 k값을 넣었기때문에 insert로 k를 빼내서 k번째 자리에 X를 채워준다.
while (!remove_val.isEmpty()){
sb.insert(remove_val.pop(),"X");
}
String answer = sb.toString();
return answer;
}
}
|
cs |
728x90
'Dev > 알고리즘 ,자료구조' 카테고리의 다른 글
[프로그래머스]자물쇠와 열쇠(JAVA) (0) | 2021.10.22 |
---|---|
[프로그래머스]게임 맵 최단거리 (0) | 2021.10.21 |
[프로그래머스]쿼드 압축 후 개수세기(JAVA) (0) | 2021.10.19 |
[프로그래머스] 배달 (0) | 2021.10.18 |
[프로그래머스]모음 사전(JAVA) (0) | 2021.10.12 |