www.acmicpc.net/problem/5430

 

5430번: AC

문제 선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다. 함수 R은 배열에 있

www.acmicpc.net

#include <iostream>
using namespace std;

int main(void)
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(0);
    
    int t;
    cin >> t;
    for(int tc = 0 ; tc < t; tc++)
    {
        int n, idx = 0, arr[100001];                                // arr 은 정수 배열
        char p[100001], temp;                                       // p 는 입력받을 함수 문자열
        cin >> p >> n >> temp;                                      // 함수문자열 -> 배열갯수 -> '[' 까지 입력
        for(int i = 0, data ; i < n ; i++)
        {
            cin >> arr[i] >> temp;                                  // 정수 입력받아서 배열에 넣고 ',' 까지 입력받음
        }                                                           // (마지막은 ',' 대신 ']')
        if(n == 0) cin >> temp;                                     // 0 일 경우는 ']' 닫는것 처리해줘야함
        int from = 0, to = n - 1, size = n, dir = 1, able = 1;      // from 이 시작점, to 가 끝점, dir 은 순방향/역방향
        while(p[idx] != '\0')
        {
            if(p[idx] == 'R')                                       // 만약 함수가 R 이라면
            {
                int temp = from;         
                from = to;                                          // 시작점과 끝점을 바꿔줌 (정수배열을 뒤집기)
                to = temp;
                dir *= -1;                                          // 뒤집어줬으니 방향도 반대방향이라고 표시해줌
            }
            else                                                    // 함수가 D 라면
            {
                if(size == 0)
                {
                    able = 0;                                       // 하나를 빼야되는데 사이즈가 0 이면 에러 처리
                    break;   
                }
                from += dir;                                        // 정상적일 경우는 하나 지워줌
                size--;
            }
            idx++;
        }
        if(able)                                                    // 함수 모두 처리 후 정상처리의 경우
        {
            if(n == 0 || size == 0)                                 // n 혹은 최종 사이즈가 0 이면 [] 만 출력
            {
                cout << "[]" << '\n';
            }
            else
            {
                cout << '[';
                for(int i = from ; i != to ; i += dir)              // 정수 배열 출력
                {                                                   // 단 from 과 to 의 인덱싱에 주의할 것
                    cout << arr[i]<< ',';
                }
                cout << arr[to] << ']' << '\n';
            }
        }
        else cout << "error" << '\n';                               // 비정상 처리는 에러 출력
    }
}

 

[Approach]

1. 파이썬으로 풀면 쉽게 금방 풀 수 있을 것 같은데.. 벡터에도 뒤집어주는 함수가 있나? reverse?

     -> 큐 사용해서 D 는 팝해주고, R은 두개씩 묶어서 없애준 뒤 구해주면 될 것 같다.

     -> 배열의 인덱스만 조정해주는 방법이 더 편할듯

2. n 이 0일 때에 대한 처리가 조금 애매한데, 예시가 있으면 좋았을 것 같다

3. 런타임에러 3스택, 예외처리에 있어서 잔 실수가 좀 있는 듯

     -> from 과 to 를 통해 반복돌리다보니 size 가 0이 된 경우에 터지게 된다.

 

[Point]

1. 덱을 쓰는 이유가 R 일 때 뒤집지 말고 앞이나 뒤에서 빼라는 거였구나.. 큐 써서 reverse 돌렸으면 큰일났을수도

 

[More]

1. 덱 사용해서 짜보기

'PS > BOJ' 카테고리의 다른 글

[백준] 18870.cpp : 좌표 압축  (0) 2020.07.04
[백준] 11279.cpp : 최대 힙  (0) 2020.07.03
[백준] 1780.cpp : 종이의 개수  (0) 2020.07.03
[백준] 1541.cpp : 잃어버린 괄호  (0) 2020.07.03
[백준] 1260.cpp : DFS 와 BFS  (0) 2020.07.02

+ Recent posts