https://www.acmicpc.net/problem/16937
import itertools
w, h = map(int, input().split())
n = int(input())
stickers = [tuple(map(int, input().split())) for _ in range(n)]
ans = 0
for sticker1, sticker2 in itertools.combinations(stickers, 2):
s1w, s1h = sticker1
s2w, s2h = sticker2
for _ in range(2):
for _ in range(2):
if max(s1h, s2h) <= h and s1w + s2w <= w: # 1번, 2번 스티커를 세로로 놓는 경우
ans = max(ans, s1w * s1h + s2w * s2h)
if max(s1w, s2w) <= w and s1h + s2h <= h: # 1번, 2번 스티커를 가로로 놓는 경우
ans = max(ans, s1w * s1h + s2w * s2h)
s2w, s2h = s2h, s2w # 2번 스티커 90도 회전
s1w, s1h = s1h, s1w # 1번 스티커 90도 회전
print(ans)
- 두 스티커로 만들 수 있는 경우의 수를 모두 고려해본다.
- 두 스티커를 모두 세로로 놓는 경우와 두 스티커를 모두 가로로 놓는 경우를 고려한다.
- 각 스티커를 90도 돌릴 때 발생할 수 있는 모든 경우의 수를 고려한다.
2 (스티커 세로 놓기, 가로 놓기 경우의 수) * 2 (1번 스티커 90도 회전 경우의 수) * 2 (2번 스티커 90도 회전 경우의 수) = 8
, 총 8가지의 경우의 수가 발생한다.- 특정 경우의 수가 모눈종이 칸 안에 들어온다면 정답이 될 수 있다.
출처: 알고리즘 중급 2/3 강의
https://code.plus/course/43