2 분 소요

사용 언어: Python3

문제

회의실 예약

풀이

내 풀이

import sys

def calc(lst):
    ans = []
    if len(lst) == 0:
        ans.append('09-18')
    else:
        for i in range(len(lst)):
            if i == 0:
                if lst[i][0] != 9:
                    ans.append('09-{}'.format(lst[i][0]))
                else:
                    pass
            if i == len(lst)-1:
                if lst[i][1] != 18:
                    ans.append('{}-18'.format(lst[i][1]))
                else:
                    pass
            else:
                if lst[i][1] != lst[i+1][0]:
                    ans.append('{}-{}'.format(lst[i][1], lst[i+1][0]))
    if len(ans) == 0:
        print('Not available')
        return
    else:
        print('{} available:'.format(len(ans)))
        for x in ans:
            print(x)

N, M = map(int, input().split())

dic = dict()
for _ in range(N):
    dic[input()] = [] # 초기화

for _ in range(M):
    r, s, e = input().split()
    s, e = int(s), int(e)
    dic[r].append((s, e))

for x in dic.items():
    x[1].sort() # 시작 시간 기준 정렬
dic = dict(sorted(dic.items())) # 회의실 이름 기준 오름차순

cnt = 0
for x in dic.items():
    cnt += 1
    print('Room {}:'.format(x[0]))
    calc(x[1]) # [(s, e)] 리스트 전달
    if cnt < N:
        print('-----')
  • 정답!
    • 하지만 거의 반나절이 걸렸다ㅜ

🌟 다른 풀이 - 정답 값 따로 저장 X

import sys

N, M = map(int, input().split())

dic = dict()
for _ in range(N):
    dic[input()] = [0] * 18 # ?

for _ in range(M):
    r, s, e = input().split()
    s, e = int(s), int(e)
    for i in range(s, e):
        dic[r][i] = 1

dic = sorted(dic.items()) # 리스트 형 변환
for i in range(N):
    cur = 1 # 현재 값
    tmp = []
    for j in range(9, 18):
        if cur == 1 and dic[i][1][j] == 0: # 1 -> 0 순간
            start = j
            cur = 0
        elif cur == 0 and dic[i][1][j] == 1: # 0 -> 1 순간
            end = j
            cur = 1
            tmp.append([start, end])
    if cur == 0: # 맨 마지막 경우 cur가 1이 되지 못하고 끝나는 경우
        tmp.append([start, 18])

    print('Room {}:'.format(dic[i][0]))
    if len(tmp) == 0:
        print('Not available')
    else:
        print('{} available:'.format(len(tmp)))
        for u in range(len(tmp)):
            print(f'{tmp[u][0]:02d}-{tmp[u][1]}') # 🌟 형식지정자 (0 추가)
    if i != N-1:
        print('-----')

내 풀이 - 0511 추가 (정답 값(res) 따로 저장)

import sys
input = sys.stdin.readline # 입력량이 많을 때 속도 증가

N, M = map(int, input().rstrip().split())

dic = dict() # 각 방 별로 회의 시간을 담아둘 사전 (ex. [0,0,...,0,1,1])
res = dict() # 각 방별로 회의 "가능" 시간을 담아둘 사전 (ex. [(10, 11), (14, 16)])

for _ in range(N):
    room = input().rstrip()
    dic[room] = [0] * 19
    res[room] = []

for _ in range(M):
    r, s, e = input().rstrip().split()
    s, e = int(s), int(e)
    for i in range(s, e):
        dic[r][i] = 1

dic = sorted(dic.items(), key=lambda x:x[0]) # dict -> list 형 변환
for x in dic:
    isStart = False
    # 빈 회의실 시간 찾아서 res에 append
    for i in range(9, 18):
        if isStart == False and x[1][i] == 0:
            isStart = True
            st = i # start time
        if isStart == True and x[1][i] == 1:
            isStart = False
            et = i # end time
            res[x[0]].append((st, et)) # x[0]은 avante
    if isStart == True: # 맨 마지막 경우 isStart가 False 되지 못하고 끝나는 경우
        res[x[0]].append((st, 18)) 

res = sorted(res.items(), key=lambda x:x[0]) # dict -> list 형 변환
for i in range(len(res)):
    print('Room {}:'.format(res[i][0]))
    if len(res[i][1]) == 0:
        print('Not available')
    else:
        print('{} available:'.format(len(res[i][1])))
        for val in res[i][1]:
            print(f'{val[0]:02d}-{val[1]}')
    if i != N-1:
        print('-----')


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기