N
: 화장실 가로 크기
A
: 2×1 크기의 타일 개수
B
: 2×2 크기의 타일 개수
beauty
: 각 타일의 예쁨
화장실 바닥 크기 내에서 2×1, 2×2 크기의 타일을 활용해 타일링했을 때 얻을 수 있는 예쁨의 최댓값을 구하는 문제이다.
화장실 바닥은 항상 세로가 2이고, 타일을 90도 회전할 수 있다.
예쁨의 최댓값을 구해야 하기 때문에 2×1, 2×2 크기의 타일들의 예쁨을 오름차순 정렬한다.
N이 홀수인 경우엔 반드시 2×1 크기인 타일이 하나 들어가야만 한다.
따라서 조건에 따라 2×1 중 가장 예쁨이 높은 타일을 먼저 배치한다.
가로 길이가 짝수가 된 남은 공간이 다 찰 때까지, 2×1, 2×2 크기의 타일들을 적절히 활용해 채워야 한다.
남은 타일 개수와 남은 공간에 유의하면서 배치한다.
타일 정렬 →
남은 공간 없을 때까지 반복 →
최종 시간복잡도
이다.
최악의 경우 이 되므로 2초 내에 연산 가능하다.
정렬 후 최대 예쁨 값 갖도록 공간 채우기
런타임 에러 (IndexError)
가 발생했다. 리스트를 pop
하는 과정에서 리스트에 값이 하나도 없을 때 그 값을 접근하려고 해서 발생한 에러인 것 같다.import sys
input = sys.stdin.readline
# N, A, B 입력
N, A, B = map(int, input().split())
# A개 이쁨 저장
A_beauty = list(map(int, input().split()))
# B개 이쁨 저장
B_beauty = list(map(int, input().split()))
# 오름차순 정렬
A_beauty.sort()
B_beauty.sort()
# 총 예쁨 합 저장할 변수 정의
beauty_sum = 0
# 채워야할 공간 정의
space = N
if space % 2 == 1:
if A_beauty:
beauty_sum += A_beauty.pop()
space -= 1
# 남은 공간 없을 때까지 채우기
while space > 0:
if len(A_beauty) < 2 and len(B_beauty) == 0:
break
if len(B_beauty) > 0 and (len(A_beauty) < 2 or B_beauty[-1] > A_beauty[-1] + (A_beauty[-2] if len(A_beauty) > 1 else 0)):
beauty_sum += B_beauty.pop()
else:
if len(A_beauty) >= 2:
beauty_sum += A_beauty.pop() + A_beauty.pop()
elif len(A_beauty) == 1:
beauty_sum += A_beauty.pop()
space -= 2
# 결과 출력
print(beauty_sum)