BruteForce_12_두스티커(16937)

Eugenius1st·2022년 5월 31일
0

Algorithm_Baekjoon

목록 보기
122/158

BruteForce12두스티커(16937)

문제

입력

첫째 줄에 모눈종이의 크기 H, W, 둘째 줄에 스티커의 수 N이 주어진다. 다음 N개의 줄에는 스티커의 크기 Ri, Ci가 주어진다.

출력

첫째 줄에 두 스티커가 붙여진 넓이의 최댓값을 출력한다. 두 스티커를 붙일 수 없는 경우에는 0을 출력한다.

풀이

  • isPossible 함수를 이용하여 주어진 두 스티커를 놓을 수 있으면 true 를 반환, 그 외 false 를 반환
  • 회전 여부는 고려되지 않은 상태
    if (isFeasible(r1, c1, r2, c2)): return True # (안회전, 안회전)
    if (isFeasible(c1, r1, r2, c2)): return True # (회전, 안회전)
    if (isFeasible(r1, c1, c2, r2)): return True # (안회전, 회전)
    if (isFeasible(c1, r1, c2, r2)): return True # (회전, 회전)
  • isFeasible 함수를 이용하여 주어진 두 스티커를 놓을 수 있으면 true 를 반환, 그 외 false 를 반환
  • 회전 여부가 결정된 상태
  • feasible 하다면 즉, 스티커를 놓을 수 있으면 MAX ans값 갱신

코드

import sys
sys.stdin = open("input.txt", "rt")
input = sys.stdin.readline

def isFeasible(r1, c1, r2, c2):
# 주어진 두 스티커를 놓을 수 있으면 true 를 반환, 그 외 false 를 반환
# 회전 여부가 결정된 상태 
    if (r1+r2 <= H and max(c1,c2) <= W): return True
    if (max(r1,r2) <= H and c1+c2 <= W): return True
    return False

def isPossible(r1, c1, r2, c2):
# 주어진 두 스티커를 놓을 수 있으면 true 를 반환, 그 외 false 를 반환 
# 회전 여부는 고려되지 않은 상태
    if (isFeasible(r1, c1, r2, c2)): return True # (안회전, 안회전) 
    if (isFeasible(c1, r1, r2, c2)): return True # (회전, 안회전) 
    if (isFeasible(r1, c1, c2, r2)): return True # (안회전, 회전) 
    if (isFeasible(c1, r1, c2, r2)): return True # (회전, 회전) 
    return False

if __name__ == "__main__":
    H, W = map(int,input().split()) 
    N = int(input())
    R = [0]*N 
    C = [0]*N
    for i in range(N): 
        R[i], C[i] = map(int,input().split())
    ans = 0;
    for i in range(N):
        for j in range(i+1,N):
            r1 = R[i]
            c1 = C[i] # 스티커 1 
            r2 = R[j]
            c2 = C[j] # 스티커 2 
            if (isPossible(r1, c1, r2, c2)): # 놓을 수 있으면 
                ans = max(ans, r1*c1 + r2*c2) # 답을 갱신 
    print(ans)

배운 것

  • 두가지 함수를 만들어 처리
profile
최강 프론트엔드 개발자가 되고싶은 안유진 입니다

0개의 댓글