알고리즘 문제 풀기

백준 11000 : 강의실 배정 - javascript()

Fo_rdang 2024. 8. 24. 15:05
반응형

문제 출처 

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

 

문제 풀이 

생각의 전환이 필요한 문제였다. 

 

- 일단 시간들을 오름차순으로 정렬하자

 

- 정렬한 시간들을 탐색한다. 

  - 그때 start의 시간이라면 방이 하나 필요하다 "+1" 는 뜻 

  - 그때 end의 시간이라면 방을 하나 반납한다 "-1" 는 뜻 

 

- 매순간 방을 최대로 쓴 값이 답이 된다. 

    - 왜냐하면 이미 우리는 강의실을 최적으로 정렬을 해놨기 때문에 

      그때 필수적으로 써야 했던 방의 개수가 최소의 강의실을 사용하는 것이 된다. 

정답 코드 

let fs = require('fs');
let [N, ...input] = fs.readFileSync('/dev/stdin').toString().trim().split("\n")
const data = input.map(v => v.split(" ").map(Number))
const objArr = [];
for(let [str,end] of data){
  objArr.push({time:str, start:1}) //시작하는 시간이라면 1 (이유는 아래 적혀있음) 
  objArr.push({time:end, start:-1})//끝나는 시간이라면 -1
}

//(이유) 
//시작하는 시간과 끝나는 시간이 같을 때는 끝나는 시간을 먼저 앞에다가 둔다. 
//-왜냐하면, 문제에서 "Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다." 고 써놨기 때문임. 
//-- 이뜻은, 끝나는 시간과 시작 시간이 동일할 때 방을 같이 쓸 수 있기 때문에 방 반납후, 방 하나 추가 하는 의미임도. 

objArr.sort((a,b)=>a.time===b.time ? a.start-b.start :a.time-b.time)

let max = 0;
let cur = 0;
for(let obj of objArr){
  obj.start ? cur++ : cur--
  max = max < cur ? cur : max
}
console.log(max)
반응형