메모리: 65.9 MB, 시간: 0.08 ms
코딩테스트 연습 > 완전탐색
정확성: 100.0
합계: 100.0 / 100.0
2024년 10월 02일 11:36:57
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
| brown | yellow | return |
|---|---|---|
| 10 | 2 | [4, 3] |
| 8 | 1 | [3, 3] |
| 24 | 24 | [8, 6] |
※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
class Solution {
public int[] solution(int brown, int yellow) {
// x: 가로, y: 세로
// brown: B = 2x+2(y-2) = 2x+2y-4
// 2(x+y) = B+4
// yellow: Y = (x-2)*(y-2) = xy-2(x+y)+4
// xy = Y+2(x+y)-4 = Y+B
// 즉, xy = B+Y
// 단, x >= y >= 3
// 카펫 모양이므로 길쭉한 모양보다는 정사각형 모양으로 나와야 하므로
// 중간에 있는 약수의 곱 구하기
int xy = brown + yellow;
int y = (int) Math.sqrt(xy); // 중간 값 찾기
int x = 0;
while (true) {
// 약수인 경우 && brown 개수가 맞으면
if (xy % y == 0 && brown == 2 * (xy / y + y - 2)) {
x = xy / y;
break;
}
y--;
}
int[] answer = { x, y };
return answer;
}
}