개발새발 로그

[JS] 백준 5430번 : AC 본문

알고리즘

[JS] 백준 5430번 : AC

이즈흐 2023. 6. 29. 13:39

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

 

5430번: AC

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

www.acmicpc.net

 

 

📋풀이방법

1. 주어진 문자열을 3개씩 변수로 나눈다.

2. 주어진 명령어 p에 따라 반복한다.

3. p가 R이면 뒤집어준다.

4. p가 D면 앞의 요소를 빼준다.

 4-1. 만약 m=0이면 error를 체크해준다.

5. 모든 반복이 끝나면 error체크유무에 따라 error를 정답 배열에 넣거나 명령어수행된 배열을 정답 배열에 넣는다.

 

 

내 제출

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim();
input=input.replace(/\r/g,"").split("\n");

let n=Number(input.shift());
let result=[];
let answer=[];
for(var i=0;i<n;i++){
    result.push([input.shift(),input.shift(),input.shift()]);
    
}
result.forEach((x)=>{
    let [p,m,arr]=x
    p=p.split("");
    arr=arr.slice(1,arr.length-1).split(",");
    let chk=false;
    let isReverse=false;
    p.forEach((E)=>{
        if(E=="R"){
            isReverse=!isReverse;
        }
        else if (E=="D"){
            if(m==0){
                chk=true;
            }
            else {
                m--;
                if(isReverse) arr.pop();
                else arr.shift();
            }
        }
    })
    if(chk){
        answer.push("error");
    }
    else {
        if(isReverse) answer.push("["+arr.reverse().join(",")+"]");
        else answer.push("["+arr.join(",")+"]");
    }
})
console.log(answer.join("\n"));

 

💢어려웠던 이유

1. 주어진 배열이 [  ~  ]  로 된 문자열이므로 [ ] 중괄호를 잘 없애줘야한다. -> slice(1,arr.length-1) 사용

2. 만약 빈 배열일 때 배열안에 빈 문자열로 인해 arr의 length가 1이 남는 상황이 생긴다.

 -문제에서 주어진 배열요소의 개수 n을 이용하면된다.

3. 시간초과 이슈

-R명령어에 계속해서 arr.reverse()를 사용하면 시간초과가 나게된다.

-isReverse라는 변수를 줘서 D명령어일 때 isReverse가 true이면 pop(), false면 shift() 수행하고, 마지막에 isReverse의 유무에 따라 뒤집어준다.

4. 마지막 정답을 출력할 때 배열요소들은 "[" "]" 중괄호 문자열을 붙여서 출력해야한다.

728x90
반응형
LIST