백준 알고리즘/Lang-node.js

[백준/node.js] 10845 큐

Jongung 2023. 1. 8. 22:52

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

 

10845번: 큐

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

  • 사용언어 : node.js
  • 알고리즘 : 자료구조, 큐
  • Solved.ac Tier : Silver IV

 

node.js 코드

1. 문제 정리

기존에 우리가 쉽게 아는 큐와 같은 문제이다.  이미 C#과 C로 풀어 본 적 있는 문제이지만, 주 언어가 된 JS엔 자료구조가 없기 때문에 직접 구현해야 한다. 따라서 앞으로 상위 문제를 풀 때 필요한 자료구조인 스택, 큐, 덱 같은 기초부터 시작해야 한다. 

큐는 FIFO 즉 선입 선출이다. 처음 들어온 데이터가 제일 마지막에 나가는 방식이다.

push가 들어오면 Queue클래스의 s_push를 사용하여 기본 함수인 push로 생성자 함수에서 받은 arr에 넣어 주었다.

s_push(num){
        this.arr.push(num);
}

pop이 들어오면 Queue클래스의 s_pop을 사용하여 기본 함수인 shift를 사용하여 생성자 함수에서 받은 arr에서 맨 처음 데이터를 빼주었다. 만약 뺄 데이터가 없다면 -1을 리턴하도록 만들었다. 

s_pop(){
        let data = this.arr.shift();
        if(!data) return -1
        return data;
}

empty가 들어오면 Queue 클래스의 s_empty를 사용하여 생성자 함수에서 받은 arr의 길이를 확인한 뒤 0보다 크면 0을 리턴해주고 아니라면 1을 리턴해 주었다.

s_empty(){
        if(this.arr.length > 0){
            return 0;
        }
        else{
            return 1;
        }
}

size가 들어오면 Stack 클래스의 s_size()를 사용하여 생성자 함수에서 받은 arr의 길이를 리턴 해 주었다.

s_size(){
        return this.arr.length;
}

front가 들어오면 Stack 클래스의 s_front를 사용하여 생성자 함수에서 받은 arr의 0번째 index를 확인하여 있으면 그 값을 리턴하고 없다면 -1을 리턴해 주었다.

s_front(){
        let data = this.arr[0];
        if(!data) return -1;
        else return data;
}

back이 들어오면 Queue 클래스의 s_back을 사용하여 생성자 함수에서 받은 arr의 마지막 index를 확인하여 있으면 그 값을 리턴하고 없다면 -1을 리턴 해 주었다.

s_back(){
        let data = this.arr[this.arr.length - 1];
        if(!data) return -1;
        else return data;
}

 

2. 완성 코드

const filePath = process.platform === 'linux' ? '/dev/stdin' : 'ans.txt';
let [N, ...inputs] = require('fs').readFileSync(filePath).toString().trim().split("\n");

class Queue{
    constructor(arr){
        this.arr = arr;
    }
    s_push(num){
        this.arr.push(num);
    }
    s_pop(){
        let data = this.arr.shift();
        if(!data) return -1
        return data;
    }
    s_empty(){
        if(this.arr.length > 0){
            return 0;
        }
        else{
            return 1;
        }
    }
    s_size(){
        return this.arr.length;
    }
    s_front(){
        let data = this.arr[0];
        if(!data) return -1;
        else return data;
    }
    s_back(){
        let data = this.arr[this.arr.length - 1];
        if(!data) return -1;
        else return data;
    }
}


const arr = [], ans = [];
let queue = new Queue(arr);
inputs.map((value)=>{
    value = value.trim().split(" ");

    if(value[0] == "push"){
        queue.s_push(parseInt(value[1]));
    }
    else if(value[0] == "empty"){
        ans.push((queue.s_empty()));
    }
    else if(value[0] == "size"){
        ans.push(queue.s_size());
    }
    else if(value[0] == "pop"){
       ans.push(queue.s_pop());
    }
    else if(value[0] == "front"){
        ans.push(queue.s_front());
    }
    else if(value[0] == "back"){
        ans.push(queue.s_back());
    }
})

console.log(ans.join("\n"))