[BOJ] 백준 5430 AC
문제 링크 : https://www.acmicpc.net/problem/5430
이 문제는 배열이 주어졌을때 R 입력은 순서를 바꾸는 것, D는 맨 앞의 문자를 지우는 것으로 명령을 수행하는 문제 입니다.
여기서 중요한 것은 입력 배열이 최대 70만이라는 것인데, 많은 입력이 주어졌고, 명령이 RRRRRRRR.... 로 주어졌다면 일반적으로 역순으로 바꾸는 로직은 많은 시간복잡도를 필요로 합니다.
따라서, 덱을 이용하여 순서를 바꾼 듯 한 효과를 주는것이 중요한 문제 입니다.
소스코드 :
#include#include #include using namespace std; // 덱에 저장한 정수들을 s의 명령에 따라 변환 및 출력하는 함수 Func1. void Func1(string s, deque dq) { // 변환명령 R이 입력될 경우를 판단할 변수 isD 선언. bool isD = false; bool flag = false; // error 항목일 경우 출력을 위한 변수 flag 선언. for (int i = 0; i < s.length(); i++) { if (s[i] == 'R') { // R이 입력 될 경우 변수 On/Off isD = !isD; } else if (s[i] == 'D') { if (!dq.empty()) { // 홀수번째 입력의 경우 : 맨 뒤의 원소 POP, 짝수번째 입력의 경우 : 맨 앞의 원소 POP. if(isD) dq.pop_back(); else dq.pop_front(); } else { // 원소가 없는데 pop 명령이 떨어질 경우 error발생 flag = true; cout << "error" << endl; break; } } } // error가 아닌경우 출력. if (!flag) { int dsize = dq.size(); cout << '['; //원소가 없을 경우, 바로 괄호 닫는다. if (dsize == 0) cout << ']'< > T; cin.ignore(); while (T--) { string s; cin >> s; cin.ignore(); int max; cin >> max; cin.ignore(); string arr; cin >> arr; cin.ignore(); deque dq; // 입력받은 배열의 길이를 담을 변수 arrlength 선언. int arrlength = arr.length(); for (int i = 0; i < arrlength; i++) { //arr[i]가 숫자일 경우 ' , ' , ' ] ' 만나기 전까지의 숫자들을 stmp에 저장. if (isdigit(arr[i])) { string stmp = ""; int tmp = i; while (tmp < arrlength) { if (arr[tmp] == ',' || arr[tmp] == ']') { break; } else { stmp += arr[tmp]; } tmp++; } // 저장한 stmp 문자열을 정수로 변환 후 덱에 Push dq.push_back(stoi(stmp)); i = tmp; } } Func1(s, dq); } }
댓글
댓글 쓰기