Algorithm (PS)

[백준] 20207 달력 Python

minjiwoo 2022. 10. 1. 15:21
728x90

https://www.acmicpc.net/problem/20207

 

20207번: 달력

 수현이는 일년의 날짜가 1일부터 365일로 표시되어있는 달력을 가지고있다. 수현이는 너무나도 계획적인 사람이라 올 해 일정을 모두 계획해서 달력에 표시해놨다.  여름이 거의 끝나가자 장

www.acmicpc.net

풀이 

Greedy 유형이라는 힌트가 나와있다
가로길이의 경우 calendar[i]를 하나씩 확인하면서 일정이 있을 때마다 계속 하나씩 더해주면 된다 (calendar[i] != 0 이면 하나씩 더함)
세로길이의 경우 현재 범위에서 일정이 겹치는 수들 중 max값으로 갱신한다. 

이 예시에서는 2일에서 9일사이의 최대 세로 길이는 3칸이다. 
그리고 10일째 될때 일정이 없는데, 이때 저장된 row값과 col 값을 이용해서 테이프의 넓이를 더해준다.
따라서 3*8 = 24를 더해준다 

11일과 12일사이에 붙일 테이프 면적을 구하는 것도 동일하게 반복하여 
2*2 = 4 를 더해준다 
최종적으로 필요한 테이프의 면적은 28이 된다. 

# 20207

n = int(input())
calendar = [0]*366

for _ in range(n):
    s, e = map(int, input().split())
    for i in range(s, e+1):
        calendar[i] += 1

row = 0 # 가로길이
col = 0 # 세로길이
result = 0
for day in calendar:
    if day != 0: # 일정이 없는 날이 아닌 경우
        col = max(col, day)
        row += 1
    else: # 일정 없을 때
        result += row * col
        row = 0
        col = 0 # 다시 초기화 해준다
result += row * col # 마지막 남은 일정들 더해주기
print(result)

 

 

728x90