항해99
99클럽 코테 스터디 21일차 TIL + 프로그래머스 카펫
Nellucia
2024. 11. 18. 06:52
문제
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한 사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
public class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int total = brown+yellow;
for (int height = 1; height <= Math.sqrt(total); height++) {
if(total % height ==0){
int width = total/height;
if ((width - 2) * (height - 2) == yellow) {
answer[0] = width;
answer[1] = height;
return answer;
}
}
}
return answer;
}
}
최대 넓이의 약수 중 차이가 작은 두 수를 구해서 정답을 구하면 되지 않을까? 해서
yellow의 약수중 차이가 적은 두 수를 구하고 거기에 +2를 구했는데 테스트 케이스 통과하길래 냅다 정답 제출했더니 성공률이 60%언저리가 나왔다
아례는 그 반례로 주어진 수가 brown = 14 , yellow =4 라면
답이 4,4 가 되기 때문에 오답이 된다.
그래서 전체크기 (brown + yellow)의 약수를 기반으로 가로와 세로를 계산하고,
그 중 (가로 - 2) * (세로 - 2) = yellow 를 만족하는 수를 찾는 조건으로 코드를 변경하여 문제를 해결할 수 있었다.