Search
Duplicate

AC

주차
20
문제번호
5430
언어
C++
티어
골드
유형
구현
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

Memo

로직 설명

배열의 시작 부분과 끝 부분을 각각 변수에 저장합니다.
R 작업이 들어왔을 때, start와 end값을 바꿔주기만 하면 됩니다. (역순이라는 것을 표현하기 위한 변수도 필요)
D 작업은 start 포인터를 증가 또는 감소시키면 됩니다. 증가되는 경우는 역순이 아닌 경우고, 감소는 역순인 경우입니다.

Code

제출 날짜

@5/13/2021

메모리

3708 KB

시간

20 ms
7등..
#include <iostream> #include <string> #include <algorithm> #define endl "\n" int T, n; std::string p, arr; int x[100001]; std::string ans; int start, end, reverse; void io_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { io_faster(); std::cin >> T; } bool is_num(char ch) { if ('0' <= ch && ch <= '9') return (1); return (0); } void parsing() { int i = 0; int size = arr.size(); int save = 0; int x_ind = 0; while (++i < size) { if (is_num(arr[i])) { save *= 10; save += (arr[i] - '0'); } else { x[x_ind++] = save; save = 0; } } } bool operation() { start = 0; end = n - 1; reverse = 1; for (size_t i = 0 ; i < p.size() ; i++) { if (p[i] == 'R') { std::swap(start, end); reverse = -reverse; } else if (p[i] == 'D') { if (start * reverse > end * reverse) { ans = "error"; return (0); } start += reverse; } } return (1); } void make_ans() { ans = "["; if (reverse == 1) for (int i = start ; i <= end ; i++) { ans += std::to_string(x[i]); if (i < end) ans += ","; } else for (int i = start ; i >= end ; i--) { ans += std::to_string(x[i]); if (i > end) ans += ","; } ans += "]"; } void solve() { std::cin >> p >> n >> arr; parsing(); if (!operation()) return; make_ans(); } void print_val() { std::cout << ans << endl; } int main() { input(); while (T--) { solve(); print_val(); } return (0); }
C++
복사