오늘은 시간이 촉박한 SCSA에 대해 알아봤다.
자격요건, 전형, 일정, 증명서 확인 등과 알고리즘 이동작업중인 상황이다.

(1).백준 5430번 AC는 pop이 아닌 shift를 요구하는 것 같은 나쁜 문제였다.
숫자로 된 배열을 자기 맘대로 문자열로 던져줬기 때문에 
앞 뒤의 "["와 "]"를 제거한 다음
해당 문자열을 ","를 기준으로 분할해 배열로 만들었다.

사실 R과 D라는 Reverse, Delete 두 가지 기능밖에 존재하지 않기 때문에
shift와 reverse를 사용하면 편하겠지만
골드등급 문제라 해보지 않고도 시간복잡도에 걸릴 것 같은 느낌이 있었다.

shift를 pop으로 전환하는 것은 reverse를 사용하면 되지만
reverse를 해야 하는 R 작업 또한 존재하기 때문에
어떻게 해야 잘 바꿀 수 있을지 고민하다가
배열 자체의 값을 0으로 초기화시키고 제거했다고 합의하는 방법을 사용했다.

마치 이분탐색을 진행하는 것 처럼 
앞, 뒤의 index값을 지정한 다음 제거해야 할 경우 앞의 index부터 0으로 초기화했다.

또한 R 작업을 해야하는 경우 
마지막 방향 체크를 위해 만든 directionSwitch의 값을 !directionSwitch로 역전시켰다.

이를 통해 directionSwitch가 false인 경우 start index를 적용하고
각각의 값을 제거할 때 마다 start의 값을 1씩 증가시켰으며
directionSwitch가 true인 경우 end index를 0으로 초기화하고
end의 값을 1씩 줄였다.

애초에 R,D처리 함수에 들어올 값은 제거할 D의 값보다 배열의 길이가 크거나 같기 때문에
추가적인 예외처리는 없어도 괜찮았다.

뭔가 새로운 방식으로 효율성을 개선해서 뿌듯했다.

const input = `4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]
R
0
[]`.split('\n')

const result = []

const calculateRD = (orders, arrLength, arr) => {
    let start = 0
    let end = arrLength-1
    let directionSwitch = false

    for(let i = 0 ; i < orders.length ; i++){
        if(orders[i] === "D"){
            if(directionSwitch){
                arr[end] = 0
                end--
            }
            else{
                arr[start] = 0
                start++
            }
        }
        else{
            directionSwitch = !directionSwitch
        }
    }

    if(directionSwitch){
        return `[${arr.filter(el => el).reverse().join(',')}]`
    }
    else{
        return `[${arr.filter(el => el).join(',')}]`
    }
}

for(let i = 1 ; i < input.length ; i += 3){
    const orders = input[i]
    const arrLength = Number(input[i+1])
    const arr = input[i+2].slice(1,input[i+2].length-1).split(',').map(Number)

    if(orders.split('').filter(el => el === "D").length > arrLength){
        result.push("error")
    }
    else{
        result.push(calculateRD(orders, arrLength, arr))
    }
}

console.log(result.join('\n'))

'회고' 카테고리의 다른 글

[취업준비일지] - 142  (0) 2023.03.11
[취업준비일지] - 141  (0) 2023.03.10
[취업준비일지] - 139  (0) 2023.03.08
[취업준비일지] - 138  (0) 2023.03.07
[취업준비일지] - 137  (0) 2023.03.06

+ Recent posts