문제
- 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤다.
- 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했다.
- 카펫의 갈색 격자의 수 brwon, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성하라.
제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.
입출력 예
참고 - 1.
https://easybrother0103.tistory.com/110
풀이
- 카펫 사이즈 경우의 수를 구하기 위해서 brwon 격자 수 + yellow 격자 수의 약수를 구한다.
- brown = 10, yellow = 2라고 가정할 때, 12의 약수를 구한다 (1, 12), (2, 6), (3, 4), (4, 3), (6, 2), (12, 1)
- 이렇게 구한 경우의 수 중에서 정답을 골라야 한다.
- 제한사항에 가로의 길이가 세로보다 길거나 같다고 있으므로, (4, 3), (6, 2), (12, 1)로 줄어든다.
- 가운데에 노란색 격자가 위치하기 위해선 가로, 세로 길이가 모두 3 이상이여야 하므로 (6, 2), (12, 1)는 걸러진다.
- 해당 카펫이 입력으로 주어진 yellow의 개수만큼 노란색 격자가 가운데에 위치할 수 있는지 구해야 한다.
(가로 - 2) * (세로 - 2) = yellow의 개수이므로 (4 - 2) * (3 - 1) = 2
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int area = brown + yellow; // 전체 격자 개수
for (int i = 1; i <= area; i++) {
int row = i; // 세로
int col = area / row; // 가로
// 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.
if (row > col)
continue;
if ((row - 2) * (col - 2) == yellow) {
answer[0] = col;
answer[1] = row;
return answer;
}
}
return answer;
}
}
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int sum = brown + yellow; // 전체 격자 개수
for (int i = 3; i < sum; i++) {
int j = sum / i;
if (sum % i == 0 && j >= 3) {
int col = Math.max(i, j);
int row = Math.min(i, j);
int center = (col - 2) * (row - 2);
if (center == yellow) {
answer[0] = col;
answer[1] = row;
return answer;
}
}
}
return answer;
}
}
'코테 스터디' 카테고리의 다른 글
이진탐색 문제 해결 - 백준 용돈 관리 (0) | 2023.05.15 |
---|---|
정렬 문제 해결 - 프로그래머스 K번째 수 (0) | 2023.05.15 |
[프로그래머스 lv2] 마법의 엘리베이터 (0) | 2023.05.01 |
[프로그래머스 lv2] 시소 짝꿍 (0) | 2023.05.01 |
[프로그래머스 lv2] 호텔 대실 (0) | 2023.05.01 |