본문 바로가기
알고리즘

[백준/파이썬] #20207

by 룰루루 2025. 3. 9.

구현 문제였고 30분 정도 풀이를 시도해보았다. 처음에는 dates라는 list에 start_date, end_date의 tuple을 저장해두고 그 tuple을 순서대로 순회하면서 문제를 풀려고 했다. 그런데 그러려고 해 보니 일정이 계속 연속되는 경우, 모든 일정에 대한 start_date, end_date를 다 변수로 갖고 있어야 하는 문제점이 발생했다. 
 
그리고 이 문제점을 마땅히 해결하지 못한 채 30분이 지나서 풀이를 보았다. 
 
달력은 길이가 무한하거나 길지 않고 365일까지만 있으니 그냥 calendar list를 선언하고 그 안에 관련 정보를 저장해도 메모리 문제가 없다는 것을 미처 생각 못 했다. 
 
풀이를 보고 이해한 다음, 풀이를 보지 않고 푼 코드는 다음과 같다. 

N = int(input())
calendar = [0] * (365 + 1)

for _ in range(N):
    S, E = map(int, input().split())
    for i in range(S, E+1):
        calendar[i] += 1

result = 0  
row = 0 # 일정 테이프의 가로 값을 추적하는 변수
col = 0 # 일정 테이프의 세로 값을 추적하는 변수

for day in calendar:
    if day != 0:    # 일정이 있는 경우 -> 계속 합산
        row += 1
        col = max(day, col)
    else:   # 일정이 없는 경우 -> 결과 변수(result)에 값 더하고 기존 변수(row, col)는 초기화
        result += row * col
        row = 0
        col = 0

# 마지막 일정의 넓이가 계산되지 않았으므로 한번 더 더해줌
result += row * col
print(result)