42842. 카펫
업데이트 시간 : 2023-12-14 15:12:46 +0000[level 2] 카펫 - 42842
성능 요약
메모리: 76.7 MB, 시간: 0.02 ms
구분
코딩테스트 연습 > 완전탐색
채점결과
정확성: 100.0
합계: 100.0 / 100.0
제출 일자
2023년 12월 5일 0:12:44
문제 설명
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] |
※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
💡 Solutions
📄 카펫.java
// 1. 초기 width와 height는 전체 크기를 바탕으로 만들 수 있는 정사각형을 기준으로 생성한다.
// 1-1 이렇게 하게된다면 width * height 는 무조건 brown + yellow 보다 작거나 같다.
// 2. 이때, width는 항상 height 보다 크다
// 4. 따라서, width * height < whole 일 경우, width를 올려준다.
// 3. 그리고 width * height > whole 일 경우, height를 내려준다.
// 5. 그렇게된다면 모든 케이스를 통과할 수 있게된다.
class Solution {
public int[] solution(int brown, int yellow) {
int whole = brown + yellow;
int width = (int)Math.sqrt(whole);
int height = width;
while (width * height != whole || (width - 2) * (height - 2) != yellow) {
if (width * height > whole) {
height--;
} else {
width++;
}
}
return new int[]{width, height};
}
}
// 투포인터가 일방적인 방식이 아니길래 하라는거 그대로 따라 내려갔다...
class Solution {
public int[] solution(int brown, int yellow) {
int whole = brown + yellow;
for (int width = whole; width >= 3; width--) {
if (whole % width == 0) { // 세로 길이 계산 가능
int height = whole / width;
if ((width - 2) * (height - 2) == yellow) {
return new int[]{width, height};
}
}
}
return new int[]{0, 0}; // 정답을 찾지 못한 경우
}
}
// 그런데 수식적으로 풀 수 있는 방법이 있더라...! 찾아보길 바란다