항해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 를 만족하는 수를 찾는 조건으로 코드를 변경하여 문제를 해결할 수 있었다.