[프로그래밍 문제] 카펫

문제 설명

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 개수는 높이2 + 넓이2 + 4(꼭짓점)으로 계산할 수 있으므로, yellow가 높이 1인 경우부터 2, 3.. 쭉 brown 개수가 일치할때까지 계산

class Solution {
    public int[] solution(final int outline, final int width) {
        for(int i=1;i==i;i++)
            if(width%i==0 && (i*2+(width/i)*2+4) == outline) 
                return new int[] {(width/i)+2, i+2};
        return null;
    }
}

결과

정확성  테스트
테스트 1 〉	통과 (0.02ms, 72.9MB)
테스트 2 〉	통과 (0.02ms, 74.8MB)
테스트 3 〉	통과 (0.02ms, 74.6MB)
테스트 4 〉	통과 (0.02ms, 76.8MB)
테스트 5 〉	통과 (0.04ms, 79.1MB)
테스트 6 〉	통과 (0.01ms, 75.1MB)
테스트 7 〉	통과 (0.03ms, 76.6MB)
테스트 8 〉	통과 (0.02ms, 74.5MB)
테스트 9 〉	통과 (0.05ms, 77.6MB)
테스트 10 〉	통과 (0.05ms, 73.1MB)
테스트 11 〉	통과 (0.02ms, 93.7MB)
테스트 12 〉	통과 (0.03ms, 73.5MB)
테스트 13 〉	통과 (0.02ms, 77MB)

풀이 설명

for문에서는 i는 높이라고 보면된다. yellow를 높이로 나누면 yellow의 넓이를 구할 수 있다. 단 정확하게 나눴을때 0으로 나눠떨어져야 한다. i(높이) x 2 + (width(yellow) / i(높이)) x 2 + 4 식을 통해 해당 높이의 테두리를 구할 수 있다.
만약 해당 높이의 테두리 수가 outline(brown)과 같으면 해당 높이와 넓이 배열을 반환한다

좋은 웹페이지 즐겨찾기