(완전탐색)카펫,

프로그래머스의 카펫 문제

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 모서리는 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 rturn 하도록 solution 함수를 작성해주세요.

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 빨간색 격자의 수 red는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
    • A : 123
    • B : 1스트라이크 1볼.
    • A : 356
    • B : 1스트라이크 0볼.
    • A : 327
    • B : 2스트라이크 0볼.
    • A : 489
    • B : 0스트라이크 1볼.
'''
6/10 1차 시도

    풀었지만 매우 지저분하다..
    다른 분들의 풀이를 보니 단 5줄에 끝낸다..
    반성하자.
    
    + 갈색 타일역시 여러 layer로 존재할 수 있는줄알았으나, 다른 사람들의 풀이를 보니 가장 마지막 1겹만 가능한 것 같다.
'''

def solution(b, r):
    red_block_aliquot_half = get_aliquot_list_half(r)
    for idx in range(0, len(red_block_aliquot_half)):
        layer = 1
        red_height = red_block_aliquot_half[idx]
        red_width = int(r / red_height)
        no_of_brown_block = brown_block_calculator(red_width, red_height, layer)

        if b == no_of_brown_block:
            return [red_width + 2 * layer, red_height + 2 * layer]
        elif b > no_of_brown_block:
            idx -= 1
            layer += 1

    return [0, 0]


def brown_block_calculator(red_width, red_height, layer):
    return (red_width + (2 * layer) + red_height + (2 * layer)) * 2 - 4


def get_aliquot_list_half(n):
    aliquot_set = set()
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            aliquot_set.add(i)
    aliquot_list = list(aliquot_set)
    aliquot_list.sort()
    return aliquot_list


if __name__ == '__main__':
    # brown = 10
    # red = 2     # [4, 3]

    # brown = 8
    # red = 1   # [3, 3]

    brown = 24
    red = 24  # [8, 6]

    print(solution(brown, red))