H
: 모눈종이의 세로 길이 ()
W
: 모눈종이의 가로 길이 ()
N
: 스티커의 수 ()
R
: 스티커의 세로 길이 ()
C
: 스티커의 가로 길이 ()
✅ 입력 조건
1. 첫번째 줄H
,W
입력
2. 두번째 줄N
입력
3. N번 반복해R
,C
입력
✅ 출력 조건
1. 2개의 스티커가 붙여진 넓이의 최댓값 출력
2. 2개의 스티커를 붙일 수 없다면0
출력
전체 크기가 H×W
이면서, 한 칸의 크기가 1×1
인 모눈종이가 있다.
N
개의 스티커가 있을 때, 2개의 스티커를 선택해서 붙였을 경우에 얻을 수 있는 가장 큰 넓이를 찾아 출력하는 문제이다.
스티커를 붙일 때,
1) 격자의 선과 일치 = 비뚤어지지 않고,
2) 서로 겹치지 않게 붙이면서,
3) H×W
크기를 벗어나지 않아야 한다.
4) 스티커가 접하는 것을 가능하며,
5) 필요한 경우 스티커를 90도 회전시켜서 붙이는 것도 가능하다.
N개의 스티커를 입력받을 때, 각 스티커의 크기가 → 틀려서 모두 입력받도록 변경H×W
보다 작은 경우만 리스트에 추가해준다.
스티커들 중 2개를 선택해서 모눈종이에 붙이는 경우들이 위의 조건들을 충족하는지 확인한다.
붙이는 경우는 다음과 같은 유형이 있을 수 있다.
1. 위아래로 붙이기
1-1. 세로 길이의 합이 H
보다 작아야 한다
1-2. 가로 길이 중 가장 긴 길이가 W
보다 작아야 한다
2. 나란히 붙이기
2-1. 가로 길이의 합이 W
보다 작아야 한다
2-2. 세로 길이 중 가장 긴 길이가 H
보다 작아야 한다
90도 회전시키는 경우는 R
과 C
의 순서만 바꿔주면 되므로,
입력받은 N
개의 (R, C)
조합과 (C, R)
조합을 함께 조건에 충족하는지 검사해준다.
이중 for문으로 2개의 스티커를 검사해준다.
스티커를 입력할 때 크기 검사로 걸러낸 스티커가 있기 때문에 전체 스티커 리스트 길이를 따로 계산해준다. (n
으로 정의)
0
부터 n-1
을 반복n-1
까지 반복스티커 조합 찾는 이중 for문 →
최종 시간복잡도
으로 최악의 경우 이다.
이는 2초 내로 계산이 가능할 것 같다.
브루트포스로 모든 스티커 조합을 확인해서 조건에 맞는 경우를 찾아 최대 넓이를 갱신하며 구하기
# N번 반복해 R, C 입력
for _ in range(N):
R, C = map(int, input().split())
# 모눈종이보다 크면 무시
if (R <= H and C <= W) or (R <= W and C <= H):
stickers.append((R, C))
# 최대 넓이 변수 정의
max_area = 0
# 전체 스티커 수 정의 (제외한 스티커 크기가 있기 때문에 따로 계산)
n = len(stickers)
for i in range(n):
# 첫번째 스티커
R1, C1 = stickers[i]
for j in range(i + 1, n):
# 두번째 스티커
R2, C2 = stickers[j]
# 위아래 붙이기
if (R1 + R2 <= H) \
or (R1 + C2 <= H) \
or (C1 + C2 <= H) \
or (C1 + R2 <= H):
max_area = max(max_area, R1 * C1 + R2 * C2)
# 나란히 붙이기
elif (R1 + R2 <= W) \
or (R1 + C2 <= W) \
or (C1 + C2 <= W) \
or (C1 + R2 <= W):
max_area = max(max_area, R1 * C1 + R2 * C2)
import sys
input = sys.stdin.readline
# H, W 입력
H, W = map(int, input().split())
# N 입력
N = int(input())
# 스티커 크기 저장할 리스트 정의
stickers = []
# N번 반복해 R, C 입력
for _ in range(N):
R, C = map(int, input().split())
stickers.append((R, C))
# 최대 넓이 변수 정의
max_area = 0
# 전체 스티커 수 정의 (제외한 스티커 크기가 있기 때문에 따로 계산)
n = len(stickers)
for i in range(n):
# 첫번째 스티커
R1, C1 = stickers[i]
for j in range(i + 1, n):
# 두번째 스티커
R2, C2 = stickers[j]
# 위아래 붙이기
if (R1 + R2 <= H and max(C1, C2) <= W) \
or (R1 + C2 <= H and max(C1, R2) <= W) \
or (C1 + C2 <= H and max(R1, R2) <= W) \
or (C1 + R2 <= H and max(R1, C2) <= W):
max_area = max(max_area, R1 * C1 + R2 * C2)
# 나란히 붙이기
elif (R1 + R2 <= W and max(C1, C2) <= H) \
or (R1 + C2 <= W and max(C1, R2) <= H) \
or (C1 + C2 <= W and max(R1, R2) <= H) \
or (C1 + R2 <= W and max(R1, C2) <= H):
max_area = max(max_area, R1 * C1 + R2 * C2)
# 정답 출력
print(max_area)