https://www.acmicpc.net/problem/25827
문제
시간 구간에 대한 질의를 처리하려고 한다. 전체 시간 구간은 [00:00:00,23:59:59]이다. h:m:s는 h시 m분 s초를 나타낸다. 전체 시간 구간은 길이가 1초인 구간으로 나누어져 있다. 즉, 전체 시간 구간은[00:00:00,00:00:01], [00:00:01,00:00:02], ..., [23:59:58,23:59:59]인 구간으로 나누어져 있다.
시간 구간에 대한 n개의 질의가 저장된 배열 A가 주어진다. 배열 A에 저장된 n개의 질의는 아래 두 가지 유형으로 구분된다. 첫 번째가 유형 1을 나타내고 두 번째가 유형 2를 나타낸다.
- 1 h1:m1:s1 h2:m2:s2 : 시간 구간 [h1:m1:s1,h2:m2:s2]에 1을 더한다.
- 2 h1:m1:s1 h2:m2:s2 : 시간 구간 [h1:m1:s1,h2:m2:s2]의 값을 출력한다.
시간 구간 [h1:m1:s1,h2:m2:s2]에 1을 더하는 유형 1의 질의는 시간 구간 [h1:m1:s1,h2:m2:s2]에 포함된 길이가 1초인 모든 구간에 1을 더하는 것을 의미한다. 예를 들어, [00:00:02,01:02:03]에 1을 더하는 질의는 [00:00:02,00:00:03], [00:00:03,00:00:04], ..., [01:02:02,01:02:03] 구간에 1을 더하는 것을 의미한다.
시간 구간 [h1:m1:s1,h2:m2:s2]의 값을 출력하는 유형 2의 질의는 시간 구간 [h1:m1:s1,h2:m2:s2]에 포함된 길이가 1초인 모든 구간의 합을 출력하는 것을 의미한다. 예를 들어, [00:00:02,01:02:03]의 값을 출력하는 질의는 [00:00:02,00:00:03], [00:00:03,00:00:04], ..., [01:02:02,01:02:03] 구간의 합을 출력하는 것을 의미한다.
전체 시간 구간 [00:00:00,23:59:59]의 초깃값은 0이다. 배열 A에 저장된 첫 번째 질의부터 n번째 질의까지 순서대로 처리하면서 유형 2의 결과를 출력하자. 단, 배열 A에는 모든 유형 1의 질의가 유형 2의 질의보다 앞부분에 저장되어 있다.
입력
첫 번째 줄에 n이 주어진다.
두 번째 줄부터 n개의 줄에 배열 A에 저장된 n개의 질의가 첫 번째 질의부터 n번째 질의까지 순서대로 주어진다. 한 줄에 한 개의 질의가 주어진다.
출력
첫 번째 줄부터 유형 2의 질의 결과를 순서대로 한 줄씩 출력한다.
풀이
Code
import sys
input = sys.stdin.readline
def solution(n) :
# 1. 누적합 수행 함수 정의
def run_prefix_sum() :
prefix_sum[0] = change[0]
# 1-1.
for i in range(1, l+1) :
# 점화식에 따라 처리
prefix_sum[i] = prefix_sum[i-1] + change[i]
# 1-2.
for i in range(1, l+1) :
# 누적합 계산 수행
prefix_sum[i] += prefix_sum[i-1]
# 2. 누적합, 변화값 리스트 생성
l = 24 * 60 * 60
prefix_sum, change = [0 for _ in range(l+1)], [0 for _ in range(l+1)]
# 3.누적합 최초 실행 여부 변수 생성
state = False
# 4.
for _ in range(n) :
information = list(map(str, input().rstrip().split(' ')))
# 4-1. 시간 구간을 초로 변환
start, end = sum([x * s for x, s in zip(map(int, information[1].split(':')), [3600, 60, 1]) if x]), sum([x * s for x, s in zip(map(int, information[2].split(':')), [3600, 60, 1]) if x])
# 4-2. 유형 1의 경우
if information[0] == '1' :
# 4-2-1. 변화값 입력
change[start] += 1
change[end] -= 1
# 4-3. 유형 2의 경우
else :
# 4-3-1. 최초 누적합 실행
if not state :
state = True
run_prefix_sum()
# 4-3-2. 값 출력
print(prefix_sum[end - 1] - prefix_sum[start - 1]) if start else print(prefix_sum[end - 1])
if __name__ == "__main__" :
n = int(input())
solution(n)
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python/BOJ] 2098. 외판원 순회 (0) | 2023.11.26 |
---|---|
[Python/BOJ] 4233. 가짜소수 (0) | 2023.11.25 |
[Python/BOJ] 26646. 알프스 케이블카 (1) | 2023.11.25 |
[Python/BOJ] 14618. 총깡 총깡 (0) | 2023.11.24 |
[Python/BOJ] 27977. 킥보드로 등교하기 (0) | 2023.11.24 |