문제
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 수가 주어진다. (1 ≤ xi ≤ 100)
전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
출력
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
풀이
예외 처리와 출력에서 계속 틀려서 10번 넘게 틀렸습니다를 보고 겨우 맞춘 문제이다....
https://www.acmicpc.net/board/view/25456
글 읽기 - ★☆★☆★ [필독] AC FAQ ★☆★☆★
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
위 게시글을 보면 자세하게 설명이 나와있다! 참고하자
내가 푼 방법을 간단하게 설명하면, 먼저 입력부터 문제를 풀기 싫게 만든다 ㅎㅎㅎ
숫자의 배열을 입력받기 위해 string 형으로 입력을 받은 뒤, 한 글자씩 보면서 숫자인 경우와 아닌 경우로 나눴다.
- 숫자의 경우 최대 100이기 때문에 3자리의 수가 나올 수 있다. 따라서 문자열을 하나 더 선언해서 숫자가 계속 될 동안 더해줬다.
- 숫자가 아닌 경우, 더했던 문자열이 비어있지 않는다면 숫자 벡터에 push 해주었다.
다음으론 연산자에 따라 연산을 해줄 차례이다.
R이 나왔다고 실제로 뒤집어버리면 시간초과가 발생하기 때문에 절대로 뒤집으면 안 된다!
뒤집어야 한다는 걸 확인하기 위해 bool 변수를 사용하였다.
D의 경우에는 제일 앞 또는 뒤의 원소를 제거해야 하기 때문에 해당 index를 저장하기 위해 head와 tail 두 변수를 사용했다.
앞서 말했던 bool 변수인 reverse가 true일 경우에는 뒤집어야 되고, false인 경우에는 뒤집히지 않은 경우이다.
따라서 true일 때는 tail을 하나 줄이고, false일 경우에는 head를 하나 늘렸다.
그리고 head가 tail보다 커진 경우엔 모든 원소가 삭제된 경우이므로 error가 발생하게 된다.
마지막으로 출력 부분이다.
error가 발생하지 않았다면, 뒤집혔는지 아닌지에 따라 index를 바꾸면서 출력하면 된다.
코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
int test_case;
cin >> test_case;
for (int t = 0; t < test_case; t++) {
string str, num_input;
int size;
cin >> str;
cin >> size;
cin >> num_input;
string temp;
vector<int> n;
for (int i = 0; i < num_input.length(); i++) {
if ('0' <= num_input[i] && num_input[i] <= '9') {
temp += num_input[i];
}
else {
if (temp.length() != 0) {
n.push_back(stoi(temp));
temp.clear();
}
}
}
bool reverse = false;
bool check = false;
int head = 0;
int tail = size;
for (int i = 0; i < str.length(); i++) {
if (str[i] == 'R')
reverse = !reverse;
else {
if (reverse) { // 거꾸로 뒤집힘
tail--;
}
else {
head++;
}
if (head > tail) {
check = true;
break;
}
}
}
if (check)
printf("error\n");
else {
printf("[");
if (reverse) { // 뒤집힌 경우
for (int i = tail - 1; i >= head; i--) {
printf("%d", n[i]);
if (i != head)
printf(",");
}
}
else { // 안 뒤집힌 경우
for (int i = head; i < tail; i++) {
printf("%d", n[i]);
if (i != tail - 1)
printf(",");
}
}
printf("]\n");
}
}
}
'Old > 백준' 카테고리의 다른 글
백준 11723번 집합 // C++ (0) | 2020.02.24 |
---|---|
백준 18111번 마인크래프트 // C++ (0) | 2020.02.24 |
백준 2512번 예산 // C++ (0) | 2020.02.23 |
백준 10815번 숫자 카드 // C++ (0) | 2020.02.23 |
백준 1929번 소수 구하기 // C++ (0) | 2020.02.23 |