https://www.acmicpc.net/step/5430
let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
let N = input.shift();
let answer = [];
for(let i = 1; i<input.length; i+=3){
let roof = input[i-1].split('')
let arr = JSON.parse(input[i + 1]);
let rCnt = 0;
let dCnt = 0;
for(let x of roof){
if(x==='R') rCnt++;
else dCnt++;
}
if(rCnt%2 !== 0){
arr.reverse()
}
let lenTF = false;
for(let i = 0; i<dCnt; i++){
if(arr.length != 0){
arr.shift()
}else{
lenTF = true;
answer.push('error')
}
}
if(!lenTF) answer.push('['+String(arr)+']')
}
console.log(answer.join('\n'))
for
문 안에서reverse
함수를 사용하다보니 시간초과가 난거 같았다.roof
안의R
의 갯수를 세어서reverse
함수를 한번만 해줬는데 시간초과가 나서reverse
에서 났을수도 있고이중포문
을 돌려서 그런거 일수도 있다고 생각했다.
let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
let N = input.shift();
let answer = [];
for(let i = 1; i<input.length; i+=3){
let roof = input[i-1].split('')
const arr = JSON.parse(input[i + 1]);
let isRevers = false;
let lenTF = false;
for(let x of roof){ // 1
if(x==='R') {
isRevers = !isRevers
}
else if(x==='D'){ // 2
if(arr.length >0){
if(isRevers) arr.pop()
else arr.shift()
}else{
lenTF = true;
answer.push('error')
break;
}
}
}
if(!lenTF) answer.push(JSON.stringify(isRevers ? arr.reverse():arr)) // 3
}
console.log(answer.join('\n'))
- 첫번째로
roof
에 들어가있는 문자열을 돌면서R
이면isReverse
를 바꿔준다D
이면arr
의 문자열이 0보다 크면 배열이 있는것이므로isReverse
함수에 따라서 앞에서 뺄지 뒤에서 뺼지를 정해준다. 만약에arr
이0
이면lenTF
를 바꿔주고answer
에error
를 넣어준다.lenTF
에 따라서error
가 들어갔는지 안들어갔는지를 체크하고 안들어간 경우면answer
에isReverse
를 검사한arr
을 넣어준다.
const fs=require('fs');
const input=fs.readFileSync('/dev/stdin').toString().split('\n');
const count=+input[0];
let arr=[];
for(let i=0;i<count;i++){
let p=input[i*3+1];
let n=+input[i*3+2];
let array=JSON.parse(input[i*3+3])
arr.push({p,n,array});
}
let result=arr.map(({p,n,array})=>{
let [left,right]=[0,n];
let dir=true;
for(let i=0;i<p.length;i++){
if(p[i]==='D'){
if(dir) left++;
else right--;
if(left>right) return 'error';
}else{
dir=!dir;
}
}
if(dir){
return JSON.stringify(array.slice(left,right))
}else{
return JSON.stringify(array.slice(left,right).reverse())
}
})
for(let i=0;i<count;i++){
console.log(result[i]);
}
left
,right
를 이용하여서shift
,pop
을 사용하지않고 계산하여서 수행시간이 굉장히 짧았다.
D
가 나왔을때isReverse(여기선 dir)
이 참이면 앞에서 빼는것이므로left
의 숫자를 ++해주고 아니라면 뒤에서 빼야하므로right
의 숫자를 --해준다. 예를 들어서(1,2,3,4)
가 있고isReverse
가true
이면 앞에서 뺴는데 예를 들어D
가 2개가 있다면left
는 현재2
가 된다. 이후에 배열을slice
함수로 잘라서 리턴하게 되면 (3,4)가 들어가는 형태이다.
시간복잡도를 처음에 계산을 하고 코딩을 시작하면 여러번 수정하거나 아예 코드 자체를 바꾸는 불상사를 줄일 수 있을거 같다.