백준 16937번 두 스티커

Hyun·2024년 2월 18일
0

코딩테스트

목록 보기
66/66
post-thumbnail


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

0개의 댓글

관련 채용 정보