https://programmers.co.kr/learn/courses/30/lessons/42842
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int sum = brown + yellow;
for (int i = 3; i <= sum/3; i++) {
int width = sum / i, height = sum / width;
if (((width - 2) * (height - 2)) == yellow && width >= height) {
answer[0] = width;
answer[1] = height;
return answer;
}
}
return answer;
}
}
def solution(brown, yellow):
# 정답 가로세로가 [x,y] 일때, yellow의 값은 가로 세로가 2씩 빠진 값인 (x-2)(y-2)임
# x * y = brown + yellow 와 y를 지우고 x에 대해 연립방정식을 정리해 근의 공식으로 만들어 코드로 그대로 씀
x = ( (4 + brown) + ( (4 + brown) ** 2 - 16 * (brown + yellow) ) ** 0.5) / 4
y = (brown + yellow) / x
# x y 값이 실수 형태로 소수점 달고 나오므로 int형 변환
answer = [int(max(x,y)), int(min(x,y))]
return answer