문제

https://programmers.co.kr/learn/courses/30/lessons/42842


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public int[] solution(int brown, int yellow) {
int sum = brown + yellow;
int[] answer = new int[2];

for (int i = 2; i < sum; i++) {
if (sum % i == 0) {
int x = ((sum / i) * 2) + ((i * 2) - 4);
int y = sum - x;

if (brown == x && yellow == y) {
answer = new int[] {sum / i, i};
break;
}
}
}
return answer;
}

흐름

  1. 갈색과 노란색을 더해 전체 크기를 구한다.
  2. 전체 크기를 2부터 반복한다. (1인 경우는 없으므로)
  3. i로 sum을 나눠서 떨어진다면, 즉 약수라면
  4. sum에서 i를 나눈 값에 2를 곱해서 위 아래 가로의 길이를 구하고
  5. i에 마찬가지로 2를 곱해서 좌 우 세로의 길이를 구하고
  6. 꼭지점들은 가로 세로가 겹치므로 -4를 한다.
  7. 이렇게 구한 갈색을 sum에서 빼서 노란색의 값을 구한다.
  8. 구한 갈색과 노란색 값이 넘겨받은 brown과 yellow와 같으면 끝
  9. 아니라면 반복한다.

결과

번호 속도
테스트 1 통과 (1.57ms, 52.3MB)
테스트 2 통과 (1.76ms, 51.1MB)
테스트 3 통과 (1.88ms, 50.1MB)
테스트 4 통과 (1.44ms, 52.7MB)
테스트 5 통과 (1.52ms, 50.5MB)
테스트 6 통과 (1.48ms, 49.8MB)
테스트 7 통과 (1.62ms, 50.8MB)
테스트 8 통과 (1.52ms, 52.6MB)
테스트 9 통과 (1.58ms, 52.4MB)
테스트 10 통과 (1.58ms, 50.4MB)
테스트 11 통과 (1.53ms, 53MB)
테스트 12 통과 (1.56ms, 52.3MB)
테스트 13 통과 (1.48ms, 53.3MB)

테스트 케이스

1
2
3
assertArrayEquals(new int[]{4, 3}, test.solution(10, 2));
assertArrayEquals(new int[]{3, 3}, test.solution(8, 1));
assertArrayEquals(new int[]{8, 6}, test.solution(24, 24));