[ 문제 해석 ]
갈색 격자수, 노란색 격자 수 yellow 가 매개변수로 주어질 때,
카펫의 가로/세로 크기를 수너대로 담은 배열을 나타내라
- 단, 중앙에는 노란색, 테두리 1줄은 갈색으로 칠해져 있음
[ 풀이 방법 ]
1) 갈색,노란색 격자 수를 더한 값의 약수를 구한다.
2) 그 약수 중에 정답이 있다.
3) (가로-2) * (세로-2) = 노란색의 개수이다.
* 조건 : 가로 길이 >= 세로 길이
[ 처음 시도 한 소스 코드 ]
import java.util.ArrayList;
public class 카펫 {
/**
- 문제 해석:
갈색 격자수, 노란색 격자 수 yellow 가 매개변수로 주어질 때,
카펫의 가로/세로 크기를 수너대로 담은 배열을 나타내라
- 단, 중앙에는 노란색, 테두리 1줄은 갈색으로 칠해져 있음
- 풀이 방법:
1) 갈색,노란색 격자 수를 더한 값의 약수를 구한다.
2) 그 약수 중에 정답이 있다.
3) (가로-2) * (세로-2) = 노란색의 개수이다.
* 조건 : 가로 길이 >= 세로 길이
**/
static int brown;
static int yellow;
public static void main(String[] args) {
brown = 10;
yellow = 2;
int[] solution = solution();
System.out.println(solution[0] + " " + solution[1]);
}
public static int[] solution() {
int[] answer = new int[2];
int sum = brown + yellow;
ArrayList<String> calNumber = cal(sum);
for (String i : calNumber) {
String[] strArr = i.split(" ");
int x = Integer.parseInt(strArr[0]);
int y = Integer.parseInt(strArr[1]);
if ((x - 2) * (y - 2) == yellow) {
answer[0] = x;
answer[1] = y;
}
}
return answer;
}
public static ArrayList<String> cal(int n) {
ArrayList<String> cal = new ArrayList<>();
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= i; j++) {
if (i * j == n) {
if (i >= j) {
cal.add(i + " " + j);
}
}
}
}
return cal;
}
}
[ 테스트 결과 ]
몇몇 테스트 코드에서 시간 초과가 발생함을 알 수 있습니다.
다른 사람의 코드를 가져와 비교해 보겠습니다.
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++) {
// 노란 격자가 가운데에 위치하기 위해 세로,가로가 모두 3이상이여야 하므로 3부터 시작
int j = sum / i;
// 가로길이를 바로 합에 나눠줘버려 세로를 구해줌
if (sum % i == 0 && j >= 3) {
// 약수가 되고, j 길이도 3이상인 것을 선택
int col = Math.max(i, j);
int row = Math.min(i, j);
// i,j 중 더 큰 값이 가로 길이가 됨
int center = (col - 2) * (row - 2);
// 가로-2 * 세로-2 = 노란색 격자 수 공식을 사용
if (center == yellow) {
answer[0] = col;
answer[1] = row;
return answer;
}
}
}
return answer;
}
}