STUDY/Algorithm

[백준] 5430 AC, C++

sinawi95 2022. 1. 3. 13:26
728x90

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

언제 풀었는지 모르는 문제지만 새롭게 풀었다.

푸는 방식은 deque같은 자료구조를 사용하지 않고 배열로만 접근해서 풀었는데, start와 end 인덱스, 순회방향을 변수로 R일땐 순회 방향만 바꾸고, D일땐 순회 방향에 맞는 맨 앞에있는 원소를 제거했다.

그외엔 어려운게 없었고 입출력은 C++이라 조금 귀찮은 작업이었다. 파이썬이라면 입출력이 조금 쉬웠을것이다.

 

#include<iostream>
#include<string> // stoi, to_string
using namespace std;

int arr[100000];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int T, N, idx, i, start_idx, end_idx;
	bool forward, error;
	string p, tmp, tmp_num, answer;
	cin >> T;
	while (T) {
		T--;
		cin >> p >> N >> tmp;

		idx = 0;
		tmp_num = "";
		for (i = 1; i < tmp.length(); i++)
		{
			if (tmp[i] == ',' || tmp[i] == ']') {
				if (tmp_num == "") {
					continue;
				}
				arr[idx] = stoi(tmp_num);
				idx++;
				tmp_num = "";
				continue;
			}
			tmp_num += tmp[i];
		}

		start_idx = 0;
		end_idx = N;
		forward = true; // array traversal direction
		error = false;

		for (i = 0; i < p.length(); i++)
		{
			if (p[i] == 'R') {
				forward = !forward;
			}
			else if (p[i] == 'D')
			{
				if (start_idx == end_idx) {
					error = true;
					break;
				}
				else {
					if (forward) {
						start_idx++;
					}
					else {
						end_idx--;
					}
					
				}
			}
		}
		answer = "";
		if (error) {
			cout << "error\n";
		}
		else {
			answer = "[";
			if (forward)
			{
				for (i = start_idx; i < end_idx; i++)
				{
					answer += to_string(arr[i]);
					if (i < end_idx - 1)
						answer += ',';
				}
			}
			else {
				for (i = end_idx - 1; i >= start_idx; i--)
				{
					answer += to_string(arr[i]);
					if (i > start_idx)
						answer += ',';
				}
			}
			answer += "]\n";
		}
		cout << answer;
	}
	return 0;
}