개발자 톡
연습문제 톡
[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