programming language/Algorithm

Softeer Level2 회의실 예약 (python)

jellylucy 2023. 11. 3. 17:25

나의 풀이

구현문제이지만 어려웠다.

일단, 입력받을 때 하나의 배열로 받고 싶었으나, 

어떻게 비교해야할지를 몰랐다.

 

1. dict()을 이용해서 key = 이름 그리고 value에 [start, end]를 넣는다.

 

시간 범위는 9부터 18까지이니,

함수에서 check = 9로 한 뒤,

start와 check 비교로 -> check 와 start 사이 공백이 있는 것을 확인한다

(= 두 수의 값 크기비교에서 start가 더 크면 공백이 있는 거니까)

 

있으면 result.append하고 check = end로 한다.

 

2. dict 관련 문법 정리

(1) for문

for key, value in testDict.items()

(2) 정렬

sorted(testDict.items())

 

항상 list로 변환해서 사용한다고 생각하면 편하다.

 

3. print 띄어쓰기 없게 하기

str을 이용한다.

print(변수, "입력하세요")

-> print(str(변수) + "입력하세요")

import sys
n, m = map(int, input().split())
# dict 으로 문자열 형태 변경
names = dict()
for _ in range(n):
  name = input()
  names[name] = []
# print(names)
for _ in range(m):
  name, s, t = input().split()
  names[name].append([int(s), int(t)])

# 딕셔너리로 회의실이름과 시간을 넣었다.
def checkTime(times):
  available = []
  check = 9
  for time in times:
    start, end = time[0], time[1]
    if (check < start):
      available.append([check, start])
    check = end
  if (check != 18):
    available.append([check, 18])
  if available == []:
    print("Not available")
  else:
    print(len(available), "available:")
    for s, e in available:
      if (s == 9):
        s = '0'+str(s)
        print(s +"-"+ str(e))
      else:
        print(str(s)+"-"+str(e))
  

def emptyRoomTime(roomname):
  # 이름으로 시간 데이터를 찾는다.
  timeData = [0,0,0,0,0,0,0,0,0,0]
  #  최대 100 
  for n, s, e in timename:
    if (n == roomname):
      for i in range(s-9, e-9):
        timeData[i] = 1

  # 사용한 것과 사용하지 않은 것을 하나의 배열로 만들었다
  # 사용하지 않은 것의 처음과 끝이 있는것을 찾아야한다.
  # for i in timeData:
  #   if (i == 0 and i+1 != 0):

# Key기준으로 dict()를 정렬하기 위해선 sorted(dictionary.items() )  를 사용한다는 것! 

for roomname, times in sorted(names.items()): # key, value
  print("Room " + str(roomname)+":")

  times.sort(key=lambda a : a[0])
  checkTime(times)
  n -= 1
  if (n != 0):
    print("-----")