이 영역을 누르면 첫 페이지로 이동
Nuhends 의 Tech Life 블로그의 첫 페이지로 이동

Nuhends 의 Tech Life

페이지 맨 위로 올라가기

Nuhends 의 Tech Life

IT / Tech / 재테크 관련 뉴스를 최대한 알기 쉽게 전달하는 Tech 블로그 입니다.

[Softeer] lv2. [21년 재직자 대회 예선] 회의실 예약 / Javascript

  • 2025.04.25 16:13
  • 프로그래밍/Algorithm
반응형

[Softeer] lv2. [21년 재직자 대회 예선] 회의실 예약 / Javascript

[21년 재직자 대회 예선] 회의실 예약

언어별 시간/메모리

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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [프로그래머스] 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
다른 글 더 둘러보기

정보

Nuhends 의 Tech Life 블로그의 첫 페이지로 이동

Nuhends 의 Tech Life

  • Nuhends 의 Tech Life의 첫 페이지로 이동
반응형

검색

메뉴

  • 홈
  • 웹 개발
  • 경제 데이터
  • 경제 공부
  • 방명록

카테고리

  • 분류 전체보기 (127)
    • 프로그래밍 (69)
      • React (3)
      • HTML&CSS 사전 (13)
      • JAVASCRIPT 사전 (11)
      • Algorithm (23)
      • 이슈 정리 (2)
      • 개발 환경 (4)
      • NodeJS (1)
      • Typescript (4)
      • NextJS (5)
      • React-Query (2)
      • 인프라 (0)
      • ai (1)
    • 경제 데이터 (22)
      • 주식 순위 (20)
      • 경제지표 (2)
    • 경제 공부 (25)
      • 경제 신문 읽기 (3)
      • 세금 재테크 (7)
      • 인사이트 (4)
      • 경제용어정리 (9)
      • 정부 지원 제도 관련 (2)
    • 팁 모음 (11)
      • 인터넷 (5)
      • 생활 (3)
      • SNS 맛집 (3)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 알고리즘
  • 프로그래머스
  • 자바스크립트
  • 코딩테스트
  • 코테 풀이
  • softeer
  • javascript
  • 코테

나의 외부 링크

정보

nuhends의 Nuhends 의 Tech Life

Nuhends 의 Tech Life

nuhends

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © nuhends. Designed by Fraccino.

티스토리툴바