eaz_algorithm

[Softeer] 회의실 예약

eaz_silver 2023. 12. 12. 23:57

[소프티어_회의실예약](https://softeer.ai/practice/6266)

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

회사에는 N개의 회의실이 있다. 수많은 팀이 모여 토론하고 업무를 처리하기 위해서는 회의실이 필수적이다. 내부망에 아주 간단한 회의실 예약 시스템이 있지만 편의성이 매우 떨어진다. 단순

softeer.ai

문제

회사에는 N개의 회의실이 있다. 수많은 팀이 모여 토론하고 업무를 처리하기 위해서는 회의실이 필수적이다.

 

내부망에 아주 간단한 회의실 예약 시스템이 있지만 편의성이 매우 떨어진다. 단순히 예약된 회의의 목록만 표시되기 때문에, 방 별로 비어 있는 시간이 언제인지를 확인하기가 힘든 것이다. 당신은 이를 직접 해결해 보기로 마음 먹었다.

 

회의실 이용 규칙은 다음과 같다:

 

- 회의실은 9시부터 18시까지만 사용 가능하다. 모든 회의의 시간은 이 안에 완전히 포함되어야 한다.

- 회의는 정확히 한 회의실을 연속한 일정 시간 동안만 점유한다. 즉 각 회의는 (회의실, 시작 시각, 종료 시각)의 정보로 나타낼 수 있다.

- 회의의 시작과 종료 시각은 시(時, hour) 단위로만 설정 가능하다. 같은 회의실을 사용하는 회의 시간은 서로 겹칠 수 없다. 여기서 겹친다는 것은, 두 회의 모두에 포함되는 시간이 1시간 이상 존재한다는 것을 의미한다. 예를 들어, 10시-12시의 회의와 11시-13시의 회의는 겹치는데, 11시-12시의 시간이 두 회의 모두에 포함되기 때문이다.

- 한 회의가 끝나는 시각에, 같은 회의실에서 다른 회의가 시작하는 것은 허용된다. 이 경우 두 회의가 겹치지 않기 때문이다.

- 길이가 0인 회의, 즉 시작 시각과 종료 시각이 동일한 회의는 예약된 바 없으며, 새롭게 잡을 수도 없다.

 

이미 예약된 M개의 회의에 대한 정보가 주어지면, 회의실별로 비어 있는 시간대를 정리해 출력하는 프로그램을 작성해 보자. 구체적인 형식은 아래를 참고하시오.

제약조건

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

 
출력예제2

Room aerocity:

1 available:

09-18

-----

Room porter:

Not available

-----

Room santafe:

1 available:

12-18



풀이1 (오답)

전혀 잘못 생각한 풀이

답도 오답이지만 잘못된 풀이에 갇혀서 계속해서 그 풀이만 고집했다.

생각했던 방법은 회의실에 예약된 시간을 다 지우고 남은 예약 가능 시간들을 리스트 형태로 두고

앞 시간 + 1 == 뒷 시간이면, 가능한 시간대가 이어지는 상태이므로 계속 진행

다르면, 가능 시간대가 끊어지므로 새로운 타임 세기 시작

이런 흐름이었는데 잘못된 풀이라는 반례를 생각해냈다.

ex) 9-10, 11-18시를 예약한 상태라면?

      9시부터 10시, 11시부터 18시까지는 예약이 되어 있고, 10시부터 11시까지 가능한 시간대가 1개 있지만

      내가 쓴 코드에서는 9,10, 11, 12, 13, ..., 18 모두 지워졌기 때문에 가능한 시간대가 없는 것으로 나온다

에휴 중간에 뭔가 이상하다 싶을때 새로운 방법을 시도할걸..,,,

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
rooms = {}

for i in range(n):
  name = input().strip()
  rooms[name] = [x for x in range(9, 19)]

for j in range(m):
  r, s, t = input().split()
  for k in range(int(s), int(t)+1):
    if k in rooms[r]:
      rooms[r].remove(k)

rooms = sorted(rooms.items())

for i in rooms:
  lst = []
  print('Room '+i[0]+':')
  count = 0
  if i[1]:
    temp = i[1][::-1]
    start = temp.pop()
    end = start + 1
    while temp:
      now = temp.pop()
      if temp and end == now:
        end = now
      else:
        count += 1
        lst.append(str(start)+"-"+str(end+1))
        start = now
        end = now
    
    print(count, end = " ")
    print("available")
    for l in lst:
      print(l)
  else:
    print('Not available')
  print('-----')

 

풀이2

리스트 형태로 놓고 각 방이 예약되면 예약 시간을 리스트의 인덱스로 찾아 1로 바꿨다.

그다음 방이 빈 시간대가 있으면 시간대를 세고 몇시부터 몇시까지인지 확인하는 방식으로 풀었다.

시작 시간을 끝나고 나서 바로 확인해주면 되는데 따로따로 확인하느라 오답이 나왔다.

가장 간단하고 확실한 방법으로 풀자!

그리고 출력형식을 잘보자,,, 9시에 09라고 되어야 하는데 시작과 끝시간 모두 한자리수일때

0을 안붙여서 오답이 많이 났다 🤦‍♀️

 

import sys
input = sys.stdin.readline

def make_result(start, end):
  new_start = '0'+str(start) if len(str(start)) == 1 else str(start)
  new_end = '0'+str(end) if len(str(end)) == 1 else str(end)
  
  lst.append(str(new_start) +'-'+str(new_end))

n, m = map(int, input().split())
rooms = {}

for i in range(n):
  name = input().strip()
  rooms[name] = [0 for x in range(9)]

for j in range(m):
  r, s, t = input().split()
  for k in range(int(s)-9, int(t)-9):
    rooms[r][k] = 1

rooms = sorted(rooms.items())

for i in rooms:
  lst = []
  print('Room '+i[0]+':')
  if 0 in i[1]:
    count = 0
    start = 9
    for j in range(9):
      if i[1][j] == 0:
        if j == 0:
          if i[1][j+1] == 1:
            end = 10
            count += 1
            make_result(start,end)
            
            start = j+10
        elif j == 8:          
          end = 18
          count += 1
          make_result(start,end)
        else:
          if i[1][j+1] == 1:
            end = j+10
            count += 1
            make_result(start,end)
            start = j+10
      else :
        start +=1
    
              
              
    print(str(count) + ' available:')
    for l in lst:
      print(l)
  else:
    print('Not available')
  
    
  if i != rooms[-1]:
    print('-----')