백준 5430번 : AC [c, python]

n0wkim·2022년 1월 13일
1

문제

풀이

입력에 따라 앞에서 지울지, 뒤에서 지울지만 판단하고, R의 개수에 따라 앞에서부터 출력할지, 뒤에서부터 출력할지 결정하면 된다.

찾아보니까 '덱'? 이라는 자료구조 (맨 앞, 맨 뒤에서만 입출력이 일어나는 자료구조)를 사용하면 된다고 한다.

그러나 나는 c언어로 구현하였고, 실제로 배열에서 제거하지 않고 출력할 때 어디부터 어디까지 출력할지만 결정하면 되기 때문에 index를 이동하는 방식으로 구현하였다.

검색한 것

없음

코드

로컬에서 실행했을 때는 test case 모두 잘 돌아가는데, 제출하면 segmentation falt가 뜬다고 나온다.

다음은 해당 코드이다. 이유를 찾아서 고쳐보도록 하겠다.

C 코드

#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;
}

python 코드

다음은 파이썬 코드이다. 로직은 동일하게 짰는데,
이 코드는 맞았고 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("[]")

소감

로직 자체는 전혀 어렵지 않고 보자마자 풀 수 있었지만, 입출력을 짜증나게 해 놓아서 오래 걸렸다.

profile
끙끙대며 배우는 중

1개의 댓글

comment-user-thumbnail
2022년 1월 14일

c 코드가 안되는 이유 : string으로 입력받고, index를 증가, 감소 시키는 방향으로 코드를 작성했는데, 항상 +2, -2로 했었다. 다만 문제는 숫자가 2자리일 경우 +3, -3을 해주어야 한다. 이 점을 생각하지 못해서 틀린 것 같다.

답글 달기