삽집하는 개발들/알고리즘

[57일차][Lv2][프로그래머스][완전탐색][42842]카펫

악투 2023. 9. 16. 00:00
반응형

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

 

입출력

brown  yellow  return
10  2  [4, 3]
8  1 [3, 3]
24 24  [8, 6]

 

코드 및 설명

import math

def solution(brown, yellow):
    sum_size = brown + yellow
    check_arr = []
    answer = []
    for idx in range(1, sum_size+1):
        if sum_size % idx == 0:
            check_arr.append(idx)
            
    for idx in range(math.ceil(len(check_arr)/2)):
        if (check_arr[idx]-2) * (check_arr[len(check_arr)-(idx+1)]-2) == yellow:
            answer.append(check_arr[len(check_arr)-(idx+1)])
            answer.append(check_arr[idx])
    
    return answer

처음 이 문제를 접했을 때 brown의 값과 yellow의 값을 더한 약수를 구하고, 제일 중간에서 매칭되는 값 즉 [1,2,4,8] 이렇다면, 2하고 4를 추출하여 정렬해서 보여주면 된다고 생각했다. 하지만 이 방식으로 코드를 짰을 때 문제점이 좀 있었다. 조건 혹은 문제가 약간 이해하기 어렵게 되어있는 것 같은 데 그림에서 보면 브라운 테두리가 위로 1, 밑으로 1, 왼쪽 1, 오른쪽 1씩 노란부분을 감싸고 있다. 즉 중간에 값을 추출한 다음 두 수에서 -2를 한 후 곱했을 때 yellow 값과 같지 않으면 그 추출값은 정답이 아니라는 뜻이 된다. 고로 약수로 전체 길이에서 반으로 나누고 그 값을 반복문을 돌리는 데 차례로 한칸씩(서로 왼쪽으로한칸, 오른쪽으로 한칸) 이동하면서 yellow와 같은 값이 되는 지를 찾으면 되는 문제이다.

반응형