문제: 카펫

data_hamster·2023년 4월 13일
0

아이디어

  • 제한사항 확인
    • 갈색 격자 수는 최소 8 이상
    • 빨간색 격자 수 는 1 이상
    • 가로길이 >= 세로길이
  • red의 갯수로 만들 수 있는 직사각형의 유형을 만들고, 그에 맞는 갯수를 가진 brown 갯수를 확인
  • 핵심은 red의 가로, 세로 길이를 알아내는 것
  • brown = 2 * (x_red + y_red) + 4 (각 대각선 모서리 수)
  • x_red + y_red = (brown - 4) / 2
  • x_red + y_red = red 갯수의 약수 곱 8 -> 1*8 2*4 4*2
  • 연립 이차식으로 풀자

내 답안

def solution(brown, red):
    x = []
    y = []
    answer=[]
    for i in range(1,(red+1)//2 + 1):
        if red/i == int(red/i) and red/i >= i:
            x.append(int(red/i))
            y.append(i)

    L = list(zip(x,y))

    for x, y in L:
        if x + y == (brown - 4) / 2:
            answer += x + 2, y + 2
    return answer

어려웠던 점

	# 처음
    for i in range(1,(red+1)//2):
    # 수정
    for i in range(1,(red+1)//2 + 1):

8일 경우 2 4, 4 2 는 같은 쌍으로 취급하기에, 시간 복잡도를 낮추기 위해 절반만 순회하도록 하였다. 큰 수로 갈수록 그 중앙값 영향이 적어 + 1 여부가 상관이 없었으나, 2일 경우, 1일 경우 아에 순회를 하지 못하여 x, y 쌍을 구하지 못하였다.
-> 간단하면서도 값이 영향을 주는 만큼, 손으로 많이 풀어보는 것이 좋겠다.

profile
반갑습니다 햄스터 좋아합니다

0개의 댓글