728x90
이해하기
문제 이해가 안 돼서 찾아봤던 블로그...
너무 쉽게 설명해주셔서 약간 허탈해졌다.
yellow가 최소값인 1일 때의 카펫 모양이다.
이 때 알 수 있는 건 카펫의 가로, 세로가 최소 3이어야 한다는 것이다.
또, (가로 - 2) X (세로 - 2) = yellow 개수 이다.
왼쪽의 예시로 계산해보면 (3 - 2) X (3 - 2) = 1 이 나오게 된다.
한 가지 더 체크해야하는 것은 제한사항에 있던 가로 길이가 세로 길이와 같거나 커야 한다는 점이다.
또한 카펫의 가로, 세로 길이는 (brown 개수 + yellow 개수)의 약수가 되어야 한다.
왼쪽의 그림으로 예를 들면 (8 + 1) = 9 이고, 가능한 쌍은 (1, 9), (3, 3), (9, 1)이다.
문제풀이
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;
}
}
int[] answer = new int[2];
int sum = brown + yellow;
가로, 세로 값을 반환하면 되니 answer의 크기는 2로 설정한다.
brown 개수와 yellow 개수를 더한 sum을 만들어둔다.
for (int i = 3; i < sum; i++) {
int j = sum / i;
가로, 세로의 최소값이 3이니 i = 3부터 시작한다.
j는 sum을 i로 나눈 값이다.
if (sum % i == 0 && j >= 3) {
만약 i가 sum의 약수이고 (and) j가 3 이상이라면 조건을 만족한 것이니 if문 내부를 실행한다.
int col = Math.max(i, j);
int row = Math.min(i, j);
int center = (col - 2) * (row - 2);
col(가로) 값이 row(세로) 값보다 커야하니 col은 Math.max, row는 Math.min을 사용한다.
center는 yellow 값이다.
if (center == yellow) {
answer[0] = col;
answer[1] = row;
return answer;
}
만약 위에서 구한 center 값이 yellow 값과 일치한다면 모든 조건을 만족한 것이니 return해준다.
'JAVA > Coding Test Study' 카테고리의 다른 글
[Lv.1] 모의고사 : Java (1) | 2024.04.01 |
---|---|
[Lv.1] 소수 찾기 : Java (0) | 2024.04.01 |
[Lv.3] 여행경로 : Java (0) | 2024.03.27 |
[Lv.2] 수식 최대화 : Java (2) | 2024.03.27 |
[Lv.3] 단어 변환 : Java (0) | 2024.03.27 |