728x90
https://www.acmicpc.net/problem/20207
풀이
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
'Algorithm (PS)' 카테고리의 다른 글
[카카오] 등산코스 정하기 Python - 다익스트라 알고리즘 응용 (0) | 2022.10.03 |
---|---|
[백준] 1753 최단경로 Python (0) | 2022.10.03 |
[백준] 17836 공주님을 구해라 ! Python (0) | 2022.09.29 |
[카카오] 신고 결과 받기 Python 풀이 - 해시 자료구조 (0) | 2022.09.29 |
[백준] 20056 마법사 상어와 파이어볼 Python (0) | 2022.09.28 |