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

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
💡 제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력

입출력 예 #1
위의 예시와 같습니다.
입출력 예 #2
문자열이 남아있지만 짝지어 제거할 수 있는 문자열이 더 이상 존재하지 않기 때문에 0을 반환합니다.
✨ 풀이
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int carpet = brown + yellow;
int x = 0;
int y = 0;
for (int i=3; i < carpet; i++)
{
y = i;
x = carpet / y;
if(x >= y)
{
if((x - 2) * (y - 2) == yellow)
{
answer[0] = x;
answer[1] = y;
break;
}
}
}
return answer;
}
}
공식을 찾지 못해서 조금 헤맸다. 먼저 노란색 격자 양옆으로 갈색 격자가 존재한다. 따라서 노란색 격자 크기는 위아래 해서 -2, 양옆 해서 -2를 해줘야 한다. 전체적인 풀이 과정은 다음과 같다.
- 갈색과 노란색 크기를 더해서 카펫의 총 크기를 먼저 구해준다.
- 해당 카펫은 노란색 격자를 감싸야 하기 때문에 최소 3칸 부터 시작해야 한다. 따라서 반복문은 3부터 시작한다.
- 세로 크기도 최소 3부터 시작해야 하기 때문에 3으로 저장해주고, 가로 크기는 카펫 총 크기에서 세로 크기로 나눠준다.
- 구한 가로가 세로보다 클 경우 앞 서 구한 노란색 격자 공식과 같은지 비교하고, 해당 값과 일치하면 반복문을 종료한다.