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

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
손으로 일일이 경우의 수를 계산해봤을때 가운데 있는 2개의 숫자들이 답에 근접한다고 생각하여 이렇게 짰었는데, 몇가지 케이스에서 오류가 났다.
대표적인 케이스가 brown : 18 & yellow :6 이 주어졌을때.
위의 첫번째 로직대로 하면 18+6= 24
약수를 구하면 [1, 2, 3, 4, 6 ,8 ,12, 24]. 이 중에 가장 가운데 있는 값은 4와 6이다.
그러나 실제로 이대로 카펫을 그려보면 총 yellow 타일이 8개가 필요한데 주어진 yellow 타일은 6개로 에러가 발생한다.
그래서 조건을 하나 더 추가해주었다.
brown타일이 yellow를 감싸는 형태로 그리기 때문에 가장자리의 값을 하나씩 빼서 정말 yellow 타일 갯수도 일치하는지 확인하는 조건.
using System;
using System.Collections.Generic;
public class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[] {};
List<int> l = new List<int>();
List<int> ans = new List<int>();
int sum = brown + yellow;
for(int i = 1; i <= sum; i++ ){
if(sum%i ==0){
l.Add(i);
}
}
if(l.Count%2 == 0){
int a = (l.Count)/2;
int b= ((l.Count)/2)-1;
while((l[a]-2)*(l[b]-2) != yellow){
a-=1;
b+=1;
}
if(l[a]>l[b]){
ans.Add(l[a]);
ans.Add(l[b]);
}else{
ans.Add(l[b]);
ans.Add(l[a]);
}
}else{
int a = (l.Count)/2;
int b = (l.Count)/2;
while((l[a]-2)*(l[b]-2) != yellow){
a-=1;
b+=1;
}
if(l[a]>l[b]){
ans.Add(l[a]);
ans.Add(l[b]);
}else{
ans.Add(l[b]);
ans.Add(l[a]);
}
}
return ans.ToArray();
}
}
중복되는 코드들이 많다.
특히 if와 else 문 안에 있는 while문은 완전히 똑같은 형태이기 때문에
이걸 하나로 합칠 방법을 찾아봐야겠다.