(1).백준 18258번 큐 2는 이름처럼 큐를 구현해야 하는 문제였다.

 

큐가 아니라 큐 2라서 그런지 조금 더 잡다한 기능들이 같이 있었는데

js는 shift가 필요한 큐를 구현할 때 시간적인 패널티가 있어서 조금 애매했다.

 

일차적으로 기본 기능으로만 접근했을 때는 시간초과가 발생했기 때문에

size를 관리하는 length라는 변수를 추가해줬고

메서드가 아닌 length 변수를 사용해 if문 조건처리를 해 값이 없는 경우 바로 -1로 넘어가게 만들었다.

 

이정도 절약으로는 답이 없었기 때문에 결국 방식을 변경했는데

queue의 shift가 문제라면 그냥 shift를 하지 않는 것을 선택했다.

 

진행되는 내용은 겨우 200만회였기 때문에 일반 배열처럼 넣기만 한 다음

shift를 진행해야 할 때 현재 index의 값을 가져온 다음 index를 1씩 증가시켜 해당 값을 버렸는데

실제로 계속 작동해야 하는 경우 배열이 무한대로 쌓이기 때문에 문제가 있곘지만

일단은 200만회라 무리없이 통과했다.

3위

const input = `15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front`.split('\n')

const queue = []
const result = []
let index = 0
let length = 0

for(let i = 1 ; i < input.length ; i++){
    if(input[i][1] == 'u'){
        const num = input[i].slice(5)
        queue.push(num)
        length++
    }
    else if(input[i][1] == 'o' && length > 0){
        result.push(queue[index])
        length--
        index++
    }
    else if(input[i][1] == 'i'){
        result.push(length)
    }
    else if(input[i][1] == 'm'){
        result.push(length == 0 ? 1 : 0)
    }
    else if(input[i][1] == 'r' && length > 0){
        result.push(queue[index])
    }
    else if(input[i][1] == 'a' && length > 0){
        result.push(queue[length + index - 1])
    }
    else{
        result.push(-1)
    }
}

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

 

 

 

생각보다 나쁘지 않은 결과긴 했지만

실제로는 사용할 수 없는 코드가 아닐까 싶었는데

문제를 해결하기 위해 index가 일정 개수 이상 쌓이면 다시 slice를 통해 배열을 초기화 해보기로 했다.

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
let queue = []
const result = []
let index = 0
let length = 0

for(let i = 1 ; i < input.length ; i++){
    if(input[i][1] == 'u'){
        const num = input[i].slice(5)
        queue.push(num)
        length++
    }
    else if(input[i][1] == 'o' && length > 0){
        result.push(queue[index])
        length--
        index++
    }
    else if(input[i][1] == 'i'){
        result.push(length)
    }
    else if(input[i][1] == 'm'){
        result.push(length == 0 ? 1 : 0)
    }
    else if(input[i][1] == 'r' && length > 0){
        result.push(queue[index])
    }
    else if(input[i][1] == 'a' && length > 0){
        result.push(queue[length + index - 1])
    }
    else{
        result.push(-1)
    }

    if(index == 1000){
        queue = queue.slice(1000)
        index = 0 
    }
}

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

 

하지만 이 코드는 메모리초과가 되었는데

기존 배열에서 slice로 재정의 한번씩 해주는게 어떤 부분에서 메모리를 많이 잡아먹는지 모르겠는데

if로 index 체크를 해봤자 200만회면 티도 안날 것 같고 slice 자체가 무거운가보다 하고 넘어가야 했다.

 

에러가 나서 곰곰이 생각해보니 어차피 이걸 고정적으로 사용할리도 없고

js로는 페이지 내에서만 작동하고 넘어갈건데 백만개는 커녕 만개 쌓일 일도 별로 없을 것 같아서

200만회를 무난하게 넘길 수 있는 기존 코드로 만족하기로 했다.

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

[개발일지] - 235  (0) 2024.02.20
[개발일지] - 234  (0) 2024.02.19
[개발일지] - 232(주말)  (0) 2024.02.17
[개발일지] - 231  (0) 2024.02.16
[개발일지] - 230  (0) 2024.02.15

+ Recent posts