#hhmmを分に変換する。
def to_minutes(n):
s = str(n)
h = int(s[:2])
m = int(s[2:])
return h*60+m
#分をhhmmに変換する。
def to_hours_minutes(n):
h = n//60
m = n%60
if h<10:
h = '0'+str(h)
else:
h = str(h)
if m<10:
m = '0'+str(m)
else:
m = str(m)
return h+m
N = int(input())
lst_times = []
for i in range(N):
start, end = input().split('-')
#開始時間を直前の5分単位の時刻にまるめる。
start = to_minutes(start)-to_minutes(start)%5
#終了時間を直後の5分単位の時刻にまるめる。
# 余りが0の時は5を余計に足してしまうので場合分けする。
if to_minutes(end)%5 == 0:
end = to_minutes(end)
else:
end = to_minutes(end)+(5-to_minutes(end)%5)
lst_times.append([start, end])
#いもす法を使う。
# 2359ではなく2400まであるので、いもす法の配列は[0]から[2401]。
imos = [0 for i in range(24*60+2)]
for time in lst_times:
#開始処理 カウントを1増やす。
imos[time[0]] += 1
#終了処理 カウントを1減らす。
imos[time[1]+1] -= 1
#それまでの配列を全て足す。
sum_imos = []
j = 0
for i in imos:
sum_imos.append(j+i)
j += i
#flagを置くことで、sum_imosの配列が0から正に変化するタイミングと
# 正から0に変化するタイミングを把握する。
ans = []
start, end, flag = 0, 0, False
for i in range(len(sum_imos)):
if sum_imos[i] == 0 and flag == False:
continue
elif sum_imos[i] != 0 and flag == False:
start = i
flag = True
elif sum_imos[i] != 0 and flag == True:
continue
elif sum_imos[i] == 0 and flag == True:
end = i-1
ans.append(to_hours_minutes(start)+'-'+to_hours_minutes(end))
start,end,flag = 0,0,False
for i in ans:
print(i)
なかなか解けなかったので解説読みました。すみません。
メモ
- 標準入力からの複数行の入力、最初に行数が指定されている場合は、n=input()で行数を取得して、for in range(n)でinput()する。
- 簡単ないもす法を習得した!