(python3)
2304번: 창고 다각형
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의
www.acmicpc.net
양쪽에서 접근하기
계단식으로 기둥 주변을 꽉꽉 채워주면 되는데요, 가장 높은 기둥을 기준으로 앞, 뒤를 나눠서 생각해야합니다. 앞부분은 직관적으로 이해하기가 쉽습니다. 쭉 탐색하면서 지금까지 높이중 가장 높았던 높이를 유지하면 됩니다. 문제는 꼭대기를 찍고 다시 내려가는 부분이죠.
이것도 정방향으로 해결하려면 지금 기둥부터 앞으로 나올 기둥들 중 가장 높은걸 채택해야합니다. 미래를 예측할순 없죠. 그래서 뒷부분은 뒤에서부터 탐색해주면 앞부분과 동일하게 해결이 가능해집니다.
가장 높은 기둥이 여러개라면? 가장 높은 첫기둥~가장 높은 마지막 기둥까지의 지붕은 직선으로 연결되어야합니다.
코드
import sys
from collections import deque
def solution(input) :
N = int(input().strip())
MAP = [0]*1001
maxn = 0 # 첫 기둥 위치
minn = 10000 # 마지막 기둥 위치
for _ in range(N) : # 첫기둥, 마지막기둥 위치 찾으면서 기둥맵 완성
n,l = list(map(int,input().split()))
maxn = max(maxn,n)
minn = min(minn,n)
MAP[n] = l
maxh = max(MAP) # 최고높이
maxhs = [] # 최고높이 기둥들의 위치
for i in range(minn, maxn+1) : # 최고 높이 기둥들 위치 찾기
if MAP[i] == maxh :
maxhs.append(i)
mintopn = min(maxhs) # 최고 높이 기둥들 중 첫번째
maxtopn = max(maxhs) # 최고 높이 기둥들 중 마지막
minarea = 0
t = 0
for i in range(minn, mintopn) : # 최고 높이 기둥 전까지 계단식으로 올라가기
t = max(t,MAP[i])
minarea+=t
minarea+=(maxtopn-mintopn+1)*maxh # 최고 높이 기둥 시작 ~ 끝까지는 직사각형
t = 0
for i in range(maxn,maxtopn,-1) : # 마지막 최고높이 기둥까지 뒤에서부터 계단식으로 올라가기
t = max(t,MAP[i])
minarea+=t
print(minarea)
input = sys.stdin.readline
solution(input)
my solved.ac :
solved.ac
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.
solved.ac
'Algorithem > 백준 PS with code' 카테고리의 다른 글
백준 #1713 - [S1] 후보 추천하기 : 정렬 (0) | 2023.06.24 |
---|---|
백준 입문자를 위한 IDE 및 제출 팁 (0) | 2023.06.22 |
백준 #1406 - [S2] 에디터 : 스택 (0) | 2023.06.20 |
백준 #2098 - [G1] 외판원 순회 : DP,비트마스킹 (0) | 2023.06.15 |
백준 #20056 - [G4] 마법사 상어와 파이어볼 : 구현 (0) | 2023.06.13 |