728x90
https://programmers.co.kr/learn/courses/30/lessons/42842
문제 설명
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] |
문제 회고
이 문제는 규칙을 찾기위해 패드에 그림을 여러번 그렸다.
그래서 찾은 규칙은
brown의 가로길이는 yellow의 (가로 + 2) 이고,
세로 길이는 yellow의 (세로 + 2) 인데 여기서 가로와 세로를 구하는 것이다 관건이다.
아무 숫자나 가로/세로가 될 수 없으니..
brown의 가로 - 상 : ( yellow 가로 + 2)
brown의 가로 - 하 : ( yellow 가로 + 2)
brown의 세로 - 상 : ( yellow 세로 + 2)
brown의 세로 - 하 : ( yellow 세로 + 2)
이고 여기서 정확한 가로의 값과 세로의 값을 구하는면 답이다.
brown 24, yellow 24를 살펴보자
yellow 24의 약수는
(1, 24)
(2, 12)
(3, 8)
(4, 6)
이다.
(세로, 가로) 의 값이 되는 것이다. (지문에서 가로가 세로보다 같거나 크다라고 했으니.)
하나씩 다해보면되는데
"(가로 + 2) * 2 + (세로 * 2)" 를해준 값이 brown값과 일치하면 답인 것이다.
여기까지 이해를 했으면 이제 아래 코드를 보면 이해가될 것이다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import java.util.*;
class Solution {
int Brown;
public boolean getResult( int first, int second ) {
int ret = ((first + 2) * 2) + (second * 2);
return (Brown == ret) ? true : false;
}
public int[] solution( int brown, int yellow ) {
int[] answer = new int[2];
Brown = brown;
for ( int i = 1; i <= yellow; ++i ) {
int head = yellow / i;
int tail = yellow % i;
if ( tail != 0 ) continue;
if ( i > head ) break;
// 정답을 찾음
if ( getResult( head, i ) ) {
answer[0] = head + 2;
answer[1] = i + 2;
break;
}
}
return answer;
}
}
|
cs |
반응형