입력에 따라 앞에서 지울지, 뒤에서 지울지만 판단하고, R의 개수에 따라 앞에서부터 출력할지, 뒤에서부터 출력할지 결정하면 된다.
찾아보니까 '덱'? 이라는 자료구조 (맨 앞, 맨 뒤에서만 입출력이 일어나는 자료구조)를 사용하면 된다고 한다.
그러나 나는 c언어로 구현하였고, 실제로 배열에서 제거하지 않고 출력할 때 어디부터 어디까지 출력할지만 결정하면 되기 때문에 index를 이동하는 방식으로 구현하였다.
없음
로컬에서 실행했을 때는 test case 모두 잘 돌아가는데, 제출하면 segmentation falt
가 뜬다고 나온다.
다음은 해당 코드이다. 이유를 찾아서 고쳐보도록 하겠다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100001
char command[MAX_SIZE];
void init(char arr[], int *delNum, int *start, int *flag){
memset(command, 0, MAX_SIZE);
memset(arr,0,MAX_SIZE*2);
*delNum = 0;
*start = 1;
*flag = 1;
}
int main(){
int N,i,arrLen,delNum;
char arr[MAX_SIZE*2];
int flag = 1;
int start,last;
scanf("%d",&N);
while (N--){
init(arr,&delNum,&start,&flag);
scanf("%s",&command[0]);
int commandLen = strlen(command);
for(i=0; i<commandLen; i++){
if(command[i]=='D')delNum++;
}
scanf("%d",&arrLen);
scanf("%s",&arr[0]);
// first condition
if(delNum > arrLen){
printf("error\n");
continue;
}
last = arrLen*2-1;
for(i=0; i<commandLen; i++){
if(command[i]=='R')flag*=-1;
else if(command[i] == 'D'){
if(flag>0){
start = start + 2;
}else{
last = last - 2;
}
}
}
// printf result
printf("start : %d, last : %d\n",start,last);
printf("[");
if(flag>0){
for(i=start;i<=last;i++){
printf("%c",arr[i]);
}
}else{
for(i=last;i>=start;i--){
printf("%c",arr[i]);
}
}
printf("]\n");
}
return 0;
}
다음은 파이썬 코드이다. 로직은 동일하게 짰는데,
이 코드는 맞았고 c로 짠 코드는 segfault로 틀렸다.
혹시 그 이유를 알게 되면 추후에 수정하도록 하겠다.
import sys
t = int(input())
for i in range(t):
p = sys.stdin.readline().rstrip()
n = int(input())
arr = sys.stdin.readline().rstrip()[1:-1].split(",")
if n ==0:
arr = []
flag = 1
for j in p:
if j == 'R':
flag *= -1
elif j == 'D':
if arr:
if flag > 0:
#pop left
arr.pop(0)
else:
#pop right
arr.pop()
else:
print("error")
flag = 0
break
if flag > 0:
print("["+",".join(arr)+"]")
elif flag <0:
print("["+",".join(reversed(arr))+"]")
elif flag != 0:
print("[]")
로직 자체는 전혀 어렵지 않고 보자마자 풀 수 있었지만, 입출력을 짜증나게 해 놓아서 오래 걸렸다.
c 코드가 안되는 이유 : string으로 입력받고, index를 증가, 감소 시키는 방향으로 코드를 작성했는데, 항상 +2, -2로 했었다. 다만 문제는 숫자가 2자리일 경우 +3, -3을 해주어야 한다. 이 점을 생각하지 못해서 틀린 것 같다.