Problem Solving/백준

[백준 BOJ] 5430_AC

돌돌김 2019. 11. 24. 01:56

 

덱(Deque)을 사용하는 문제 중 하나.

 

문제를 이해하는데는 많이 어렵지 않았지만,

  1. 배열의 입력이 [1,2,3] 으로 들어오는 것을 처리하는게 까다로웠다.
  2. 빈 배열이 입력되는 경우
  3. 덱의 자료형이 int이기 때문에 원소 사이사이 쉼표를 넣고 마지막 원소에는 쉼표를 넣지 않는 처리
    • ex) [1,2,3,] 이렇게 되지 않도록

또한, 'R' 입력의 경우 실제로 덱을 reverse 하는것이 아니라 flag 변수를 선언하여 배열이 reverse 상태인지 확인만 시켜주어야 시간초과가 안난다.

 

테스트 케이스가 첫줄에 주어지는 문제여서 사용한 변수들의 초기화도 중요한 부분이다. 이 문제에서는 덱만 초기화 시켜주면 되었다.

 

처음에 문제를 풀때 덱의 자료형을 'char'로 선언하였다. 이렇게 하면 숫자가 두자리 숫자일 때, [1,2,34] 가 'R'명령을 입력 받으면 [43, 2, 1] 이런식으로 바뀐다. 때문에 덱의 자료형을 'int'로 선언하여 사용하였다.

 

이때  stoi를 활용하였다. 

 

stoi : string to int

  • #include<string>를 불러와야 함 
  • string str = "123";  cout<<stoi(str); 과 같이 사용
  • 만약 숫자 외 문자가 포함될 경우, 숫자만 int로 바꿈

 cf)

  1. stof : string to float
  2. stol : string to long int 
  3. stod : string to double

[문제 해결 방법]

  • 입력 과정(전처리)
더보기
  • 빈 배열의 경우([]) 덱이 int형 이므로 push_back이 안되기 때문에 이 경우는 제외하였다.
  • 입력의 맨 처음, 맨 마지막은 '[' 와 ']' 이므로 이 또한 제외하였다. 
  • if : 임시 문자열 tmp를 선언하고, '0'<=arr[i] && arr[i]<='9' 의 경우 tmp에 이어붙였다.
  • else : tmp를 덱에 push_back하고 tmp를 초기화하였다.
  • 마지막 원소는 if에 걸리기 때문에 for문 바깥에서 push_back 하였다.
  • 명령 처리
    • 'R' 명령
      • bool 변수로 정방향, 역방향의 여부만 확인하였다.
    • 'D' 명령
      • 빈 배열의 경우(입력이 "[]") error를 출력해야하므로 flag형태인 is_empty 변수를 true로 하고 break
      • 정방향 : pop_front()
      • 역방향 : pop_back()
  • 출력 처리
    • 'error' 출력 : 빈 배열에서 'D' 명령을 실행한 하나의 경우이므로 is_empty 변수가 true일 경우 'error'를 출력
    • if - 빈 배열 출력 : dq.empty()일 경우 [] 만 출력
    • else -
      • 맨 처음과 맨 마지막에 각각 '['와 ']'를 출력해준다.
      • 정방향 : dq.front(); dq.pop_front();
      • 역방향 : dq.back(); dq.pop_back();
      • 쉼표 처리 : dq.size()>=1 일 경우 cout<<","

 

[좀 더 생각 해볼 점/ 아쉬운 점]

  • 쉼표처리가 뭔가 아쉽다

 

 

소스코드 : https://github.com/midaslmg94/Baekjoon/commit/ba1c92c0b575e4ff136ed89b094d95534f5e3633