개발자 톡

연습문제 톡 [HSAT 5회 정기 코딩 인증평가 기출] 업무 처리

JS

등록일
2024-11-12 02:58:13
조회수
105
작성자
vavoya6324



class Que {
    constructor() {
        this.lenght = 0
        this.head = null
        this.tail = null
    }

    push(v) {
        // 큐가 비었음
        if (this.lenght === 0) {
            this.head = this.tail = [v, null]
        }
        else {
            this.tail[1] = [v, null]
            this.tail = this.tail[1]
        }
        return ++this.lenght
    }

    pop() {
        let v = null
        if (this.lenght >= 1) {
            v = this.head[0]
            if (this.lenght === 1) {
                this.tail = this.head = null
            }
            else {
                this.head = this.head[1]
            }
            this.lenght--
        }
        return v
    }
}

class Tree {
    constructor(height, tasksGroup) {
        this.doneTaskSum = 0
        this.height = height
        this.date = 1
        this.list = Array.from({length: Math.pow(2, height + 1)}, () => new Que())

        const startNum = Math.pow(2, height)
        for (let i = startNum; i < this.list.length; i++) {
            tasksGroup[i - startNum].forEach((task) => {
                this.list[i].push(task)
            })
        }
    }

    scheduler() {
        // 첫날은 리프 노드가 작업을 하나도 안했기에 대기
        if (this.date === 1) {
            return this.date++
        }
        const length = Math.pow(2, this.height)
        for (let i = 1; i <= length; i++) {
            // 현재 직원 작업 완료 큐
            const que = this.list[i]
            // 하급자 작업 완료 큐
            let subordinateQue = null
            // 짝수 날에는 오른쪽
            if (this.date % 2 === 0) {
                subordinateQue = this.list[(i << 1) + 1]
            }
            // 홀수는 왼쪽
            else {
                subordinateQue = this.list[(i << 1)]
            }

            if (subordinateQue && subordinateQue.lenght >= 1) {
                que.push(subordinateQue.pop())
            }
        }
        this.date++
    }

    getDone() {
        const que = this.list[1]
        while (que.lenght > 0) {
            this.doneTaskSum += que.pop()
        }
        return this.doneTaskSum
    }
}

// 입력처리
const fs = require('fs')
const input = fs.readFileSync('input.txt', 'utf8')
    .trim()
    .split(/\n+/)
const [H, _, date] = input[0].trim().split(/\s+/).map(Number)
const tasksGroup = input.slice(1).map(v => v.trim().split(/\s+/).map(Number))

const tree = new Tree(H, tasksGroup)

for (let i = 0; i < date; i++) {
    tree.scheduler()
}
console.log(tree.getDone())
#[HSAT_5회_정기_코딩_인증평가_기출]_업무_처리
#js

이 카테고리의 톡 더보기