[JavaScript] 백준 5430 : AC

2022. 8. 3. 16:13Algorithm/백준

class : 3

level : gold 5

문제 링크 : AC

 

5430번: AC

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

www.acmicpc.net

My Solution

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim();
input = input.split('\n');
const T = parseInt(input.shift());
let answer = '';
for(let i = 0; i < T;i++){
    const instruction = input[3*i];
    let start = 0,end = Number(input[3*i+1]);
    let arr = input[3*i+2].split(/\D/g).filter(v=>v!=='');
    let IsReverse = false;
    if(instruction.includes('D') && instruction.match(/[D]/g).length > end){
        answer+='error\n';
        continue;
    }
    instruction.split('').forEach(item=>{
        if(item==='R')
            IsReverse = !IsReverse;
        else{
            if(IsReverse)
                end--;
            else
                start++;
        }
    })
    if(start>=end){
        answer+='[]\n'
        continue;
    }
    if(IsReverse){
        answer+='[';
        for(let j = end-1;j>start;j--)
            answer+=`${arr[j]},`;
        answer+=`${arr[start]}]\n`;
    }
    else{
        answer+='[';
        for(let j=start;j<end-1;j++)
            answer+=`${arr[j]},`;
        answer+=`${arr[end-1]}]\n`;
    }
}
console.log(answer.trim());

 

풀이방법

처음 T개의 test case를 받는다.

아래의 행위을 T번 반복한다.

1. start는 0, end는 n개로 받는다.(실제 개수는 n개이고 index기준으로 하기에 end는 항상 -1을 넣어 계산해준다.)

2. arr는 정규식(/\D/g)를 이용하여 숫자가 아닌 것들을 기준으로 나눠준다. 그 후 빈 값을 필터링해준다.

3. IsRevers라는 값은 명령어로 인하여 배열이 뒤집어 졌는지를 판별한다. 초기값은 false다.

4. 명령어에 'D'라는 뒤집기 명령어가 있고 'D'의 개수가 배열의 크기를 초과한다면 error를 반환한다.

5. 명령어를 하나씩 받아 'R'을 받으면 IsReverse를 반대로 바꾸어 준다. 'D'를 받으면 IsReverse를 판별하여 IsReverse가 true일 경우 end를 1 감소시키고, false일 경우 start를 1 증가시킨다.

6. start가 end보다 크거나 같을 때, 배열이 비어있기에 빈 배열을 반환한다.(사실 앞에서 'D'의 개수를 처리하였기에 start와 end가 같은지로 판별하여도 된다.)

7. IsReverse가 true면 end-1부터 start까지 거꾸로 원소들을 출력하고 false면 start부터 end-1까지 원소들을 순서대로 출력한다.

 

 

느낀점
비어있는 배열일때, undefined가 나오는 경우가 있었다. 이를 해결하느라 약간의 시간이 걸렸다.