카펫

HeeSeong·2021년 1월 23일
0

프로그래머스

목록 보기
20/97
post-thumbnail

🔗 문제 링크

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 이하인 자연수입니다.

  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.



💡 풀이 (사용언어 : Java & Python)


Java

class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        int sum = brown + yellow;
        for (int i = 3; i <= sum/3; i++) {
            int width = sum / i, height = sum / width;
            if (((width - 2) * (height - 2)) == yellow && width >= height) {
                answer[0] = width;
                answer[1] = height;
                return answer;
            }
        }
        return answer;
    }
}

Python

def solution(brown, yellow):
    
    # 정답 가로세로가 [x,y] 일때, yellow의 값은 가로 세로가 2씩 빠진 값인 (x-2)(y-2)임
    # x * y = brown + yellow 와 y를 지우고 x에 대해 연립방정식을 정리해 근의 공식으로 만들어 코드로 그대로 씀 
    x = ( (4 + brown) + ( (4 + brown) ** 2 - 16 * (brown + yellow) ) ** 0.5) / 4
    y = (brown + yellow) / x
    
    # x y 값이 실수 형태로 소수점 달고 나오므로 int형 변환
    answer = [int(max(x,y)), int(min(x,y))]
    return answer
profile
끊임없이 성장하고 싶은 개발자

0개의 댓글