[Softeer]회의실 예약 파이썬 풀이
Softeer 회의실 예약¶
문제 page: https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=626
문제의 설명이 꾀나 복잡하므로 input data와 그에 따라 처리해야할 output을 먼저 살펴보자.
회의실 예약
'''
inputs:
- N, M
N(int): 회의실 수
M(int): 예약된 회의의 수
- 회의실 이름
- 회의실 이름, 회의 시작 시간, 회의 종료 시간
outputs:
Room 이름(오름차순):
회의 가능한 시간대 갯수
회의 가능한 시간(오름차순)
'''
문제에 주어진 예시(예제1)를 통해 상황을 살펴보자.
In [3]:
from IPython.display import Image
Image('회의실예약1.png')
Out[3]:
Room grandeur의 경우 input data로
1) s1, t1 = 11, 12
2) s2, t2 = 16, 18
로 주어진다.
이 때 output은 09-11, 12-16이다.
즉,
1) 09 - + str(s1)
2) str(t1) + ' - ' + str(s2)
각각의 회의실에 대해 s, t에 대한 정보를 담아 반복문으로 처리하면 될 것 같다.
이 때 주의해야할 점은
1) 시작시간에 대한 처리
2) 끝나는 시간에 대한 처리이다.
그러면 이용가능한 회의실의 갯수는 어떻게 구할 수 있을까?
위에서 가능한 회의 시간대를 구했으므로 list에 저장한다.
따라서, list의 길이가 이용가능한 회의실의 갯수이다.
'-----'의 경우는 마지막 결과를 제외하고 모두 아래쪽에 출력이 된다.
(생각을 바꿔서 처음 결과를 제외하고 모두 위쪽에 출력이 된다고 생각해도 된다.)
이를 구현하기 위해서는 다양한 방법이 있겠지만 매번 처리가 끝날 때마다 count를 해줘서 결과값이 N-1이면 print하지 않는 방안이 있다.
해답¶
In [4]:
N, M = input().split()
N = int(N)
M = int(M)
rooms = {}
for _ in range(N):
rooms[input()] = []
for _ in range(M):
r, s, t = input().split()
rooms[r].append( (int(s), int(t)) )
n_room = 0
for r, times in sorted(rooms.items()):
result = []
temp = None
for s, t in sorted(times):
if temp is None:
if s == 9:
temp = t
continue
result.append( (9, s) )
temp = t
continue
if temp==s:
temp = t
continue
result.append((temp, s))
temp = t
if temp != 18:
result.append( (temp, 18) )
print('Room ' + str(r) + ":")
num = len(result)
if num==0:
print("Not available")
elif not rooms[r]:
print('1 available:')
print('09-18')
else:
print(str(num) + " available:")
for s_time, t_time in result:
print( '%02d-%02d' % (s_time, t_time))
n_room +=1
if n_room < N:
print('-'*5)
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 Room avante: Not available ----- Room grandeur: 2 available: 09-11 12-16 ----- Room sonata: 3 available: 09-10 11-14 16-18
In [6]:
# second ans
N, M = [int(x) for x in input().split()]
rooms = []
schedule = {}
for _ in range(N):
room = input()
rooms.append(room)
schedule[room] = []
for _ in range(M):
r, s, t = [x for x in input().split()]
s = int(s)
t = int(t)
schedule[r].append((s, t))
N_room = 0
for room, times in sorted(schedule.items()):
if N_room < N and N_room>0:
print('-'*5)
N_room +=1
print('Room ' + room + ':')
count = 0
result = []
if times==[]:
print('1 available:')
print('09-18')
continue
times.sort()
if times[0][0] != 9:
count += 1
result.append('09-'+str(times[0][0]))
for i in range(1, len(times)):
if not times[i-1][1] == times[i][0]:
count +=1
result.append(str(times[i-1][1])+ '-'+str(times[i][0]))
if times[-1][1] != 18:
count +=1
result.append(str(times[-1][1])+'-18')
if count == 0:
print('Not available')
continue
print(str(count)+' available:')
for time in result:
print(time)
3 2 santafe aerocity porter santafe 9 12 porter 9 18 Room aerocity: 1 available: 09-18 ----- Room porter: Not available ----- Room santafe: 1 available: 12-18