[Softeer] lv2. [21년 재직자 대회 예선] 회의실 예약 / Javascript
[Softeer] lv2. [21년 재직자 대회 예선] 회의실 예약 / Javascript
언어별 시간/메모리
JavaScript | 1초 | 1024MB |
C | 1초 | 1024MB |
C++ | 1초 | 1024MB |
Java | 1초 | 1024MB |
Python | 1초 | 1024MB |
문제
회사에는 N개의 회의실이 있다. 수많은 팀이 모여 토론하고 업무를 처리하기 위해서는 회의실이 필수적이다.
내부망에 아주 간단한 회의실 예약 시스템이 있지만 편의성이 매우 떨어진다. 단순히 예약된 회의의 목록만 표시되기 때문에, 방 별로 비어 있는 시간이 언제인지를 확인하기가 힘든 것이다. 당신은 이를 직접 해결해 보기로 마음 먹었다.
회의실 이용 규칙은 다음과 같다:
- 회의실은 9시부터 18시까지만 사용 가능하다. 모든 회의의 시간은 이 안에 완전히 포함되어야 한다.
- 회의는 정확히 한 회의실을 연속한 일정 시간 동안만 점유한다. 즉 각 회의는 (회의실, 시작 시각, 종료 시각)의 정보로 나타낼 수 있다.
- 회의의 시작과 종료 시각은 시(時, hour) 단위로만 설정 가능하다. 같은 회의실을 사용하는 회의 시간은 서로 겹칠 수 없다. 여기서 겹친다는 것은, 두 회의 모두에 포함되는 시간이 1시간 이상 존재한다는 것을 의미한다. 예를 들어, 10시-12시의 회의와 11시-13시의 회의는 겹치는데, 11시-12시의 시간이 두 회의 모두에 포함되기 때문이다.
- 한 회의가 끝나는 시각에, 같은 회의실에서 다른 회의가 시작하는 것은 허용된다. 이 경우 두 회의가 겹치지 않기 때문이다.
- 길이가 0인 회의, 즉 시작 시각과 종료 시각이 동일한 회의는 예약된 바 없으며, 새롭게 잡을 수도 없다.
이미 예약된 M개의 회의에 대한 정보가 주어지면, 회의실별로 비어 있는 시간대를 정리해 출력하는 프로그램을 작성해 보자. 구체적인 형식은 아래를 참고하시오.
Softeer - 현대자동차그룹 SW인재확보플랫폼
softeer.ai
제약 조건
1 ≤ N ≤ 50
1 ≤ M ≤ 100
회의실의 이름은 영문 알파벳 소문자로만 이루어져 있으며 길이는 1 이상 10 이하이다.
주어지는 모든 시각은 9 이상 18 이하이다.
회의의 시작 시각은 회의의 종료 시각을 1시간 이상 앞선다.
입력 형식
첫째 줄에 회의실의 수와 예약된 회의의 수를 나타내는 정수 N과 M이 공백을 사이에 두고 주어진다.
이어 N개의 줄에는 각 회의실의 이름이 주어진다.
이어 M개의 줄에는 각 회의가 배정된 회의실의 이름 r과 시작 시각 s, 그리고 종료 시각 t가 공백을 사이에 두고 주어진다.
출력 형식
각 회의실에 대한 정보를 회의실 이름의 오름차순으로 출력한다.
각 회의실에 대한 정보는 다음과 같다.
첫째 줄에는 { Room 회의실이름: } (중괄호 제외)을 출력한다.
둘째 줄에는 예약가능 시간을 출력한다.
- 예약 가능한 시간대의 개수를 n이라고 할 때, { n available: } (중괄호 제외)을 출력하고, 뒤따른 n개의 줄에 예약 가능한 시간대를 { 09-18 } (하이픈 한개, 중괄호 제외)형태로 출력해야 한다. 한 자리 수의 경우 앞에 0을 붙여 두 자리 수로 만들어야 함에 유의하라.
- 예약 가능한 시간이 없다면, Not available을 출력한다.
각 회의실에 대한 정보 사이에는 ----- (하이픈 다섯 개)로 구분선이 출력되어야 한다.
입력 예제1
3 7
grandeur
avante
sonata
sonata 14 16
grandeur 11 12
avante 15 18
sonata 10 11
avante 9 12
grandeur 16 18
avante 12 15
출력 예제1
Room avante:
Not available
-----
Room grandeur:
2 available:
09-11
12-16
-----
Room sonata:
3 available:
09-10
11-14
16-18
입력 예제2
3 2
santafe
aerocity
porter
santafe 9 12
porter 9 18
출력 예제1
Room aerocity:
1 available:
09-18
-----
Room porter:
Not available
-----
Room santafe:
1 available:
12-18
풀이
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const pad = (n) => String(n).padStart(2, '0')
const OEPN_TIME = 9;
const CLOSE_TIME = 18;
let N = 0;
let M = 0;
let rooms = [];
let info;
rl.on('line', (line) => {
if (N === 0 && M === 0) {
[N, M] = line.trim().split(' ').map(Number);
} else if (rooms.length < N) {
rooms.push(line.trim());
} else if (rooms.length === N) {
if (!info) {
info = {}
rooms.sort().forEach(r => info[r] = [])
}
const [room, start, end] = line.trim().split(' ')
info[room].push([Number(start), Number(end) - Number(start)]); // { grandeur: [ [11, 1] ] }
}
});
rl.on('close', () => {
// 예약된 회의시간 배열 오름차순 정렬
for (let room in info) {
info[room] = info[room].sort((a, b) => a[0] - b[0]);
}
for (let room in info) {
let current = OEPN_TIME;
let aList = [];
if (room !== rooms[0]) {
console.log('-----')
}
console.log(`Room ${room}:`);
info[room].forEach((time, index) => {
const [s, total] = time;
if (current < s) {
aList.push([current, s])
}
current = s + total;
})
if (current < CLOSE_TIME) {
aList.push([current, CLOSE_TIME])
}
if (aList.length) {
console.log(`${aList.length} available:`);
aList.forEach((v) => {
const [s, e] = v;
console.log(`${pad(s)}-${e}`)
});
} else {
console.log('Not available')
}
}
});
후기
1. 가끔 백엔드에서 통데이터를 내려줄 때 프론트에서 처리하는 케이스와 유사한 실무에 가까운 문제여서 재밌었다.
2. 규칙을 찾는데 오래 걸리진 않았지만, 이걸 코드로 표현하는데 오래 걸렸다. 예를들어 [ [11, 12], [16, 18] ] 이라는 2차원 배열을 순회하면서 [ [9, 11], [12, 16] ] 로 바꾸는 부분이 어려웠음. 포인트는 반복문 외부 변수 current를 만들어두고 OPEN_TIME으로 초기 할당한 후, current를 체크하여 결과 배열에 추가 여부를 결정하고 current를 다시 start 값으로 변경해주는 부분임.
3. 또한 반복문을 다 돌고 나서도 current 값과 CLOSE_TIME를 비교하여 `${current}~${CLOSE_TIME}` 처리를 추가하는 부분 추가함
4. info[room].push([Number(start), Number(end) - Number(start)]); 부분을 사실 info[room].push([Number(start), Number(end)]); 이렇게 처리하는게 더 효율적임. 하지만 헷갈려서 예약시간(ex: 2시간)으로 읽고 싶어서 이렇게 처리했음.
'프로그래밍 > Algorithm' 카테고리의 다른 글
[프로그래머스] lv1. 나머지가 1이 되는 수 찾기/ Javascript (0) | 2025.04.25 |
---|---|
[프로그래머스] lv1. 약수의 합 / Javascript (0) | 2025.04.25 |
[Softeer] lv2. 8단 변속기 / Javascript (0) | 2025.04.24 |
[Softeer] lv2. [21년 재직자 대회 예선] 전광판 / Javascript (1) | 2025.04.24 |
[Softeer] lv2. 금고털이 풀이 / Javascript (0) | 2025.04.23 |
댓글
이 글 공유하기
다른 글
-
[프로그래머스] lv1. 나머지가 1이 되는 수 찾기/ Javascript
[프로그래머스] lv1. 나머지가 1이 되는 수 찾기/ Javascript
2025.04.25 -
[프로그래머스] lv1. 약수의 합 / Javascript
[프로그래머스] lv1. 약수의 합 / Javascript
2025.04.25 -
[Softeer] lv2. 8단 변속기 / Javascript
[Softeer] lv2. 8단 변속기 / Javascript
2025.04.24 -
[Softeer] lv2. [21년 재직자 대회 예선] 전광판 / Javascript
[Softeer] lv2. [21년 재직자 대회 예선] 전광판 / Javascript
2025.04.24