프로그래머스 [카펫] - 구현 Lv.2

JH.P·2022년 7월 22일

사각형의 넓이를 이용

  • 사각형의 넓이를 이용한 풀이였다.

로직

  • 해당 문제의 핵심 키워드는 "갈색 테두리의 사각형은 1줄", "세로의 길이는 가로보다 길 수 없다." 이다.
  • 즉, 정사각형 또는 "가로로 긴" 직사각형 모양 이 두 가지 중 하나만 나올 수 있다.
  • 우선 중앙에 노란 사각형이 그려고, 그 위에 1줄은 갈색 테두리의 사각형이 그려진다.
  • 따라서 노란 사각형의 가로 길이가 x, 세로 길이가 y라면, 갈색 테두리의 사각형은 x + 2, y + 2의 가로와 세로 길이를 가진다.
  • 위에 작성한 조건 중, 사각형은 무조건 가로로 길거나 정사각형일 수 밖에 없다는 내용이 있으니, 중앙에 위치할 노란 사각형을 가로로 가장 길게 그린다.
    • 제시된 노란 사각형의 [갯수 = 넓이] 이므로 세로 길이를 1, 가로 길이를 갯수로 한다.
  • 이때, 갈색 사각형의 넓이를 구할 수 있게 된다. 노란 사각형의 가로 세로에 각각 2씩 더하면 된다.
  • 이를 통해 구한 갈색 사각형의 넓이가 총 카펫의 갯수와 같으면 된다.
    • 그래야 문제에서 제시되는 카펫의 형태와 모양이 일치하게 될 것이다.
  • 일치한다면, 갈색 사각형의 가로와 세로를 반환한다.
  • 일치 하지 않는다면 노란 사각형의 세로의 길이를 1 늘리고, 가로 길이는 그에 맞춰 원래 가로 길이를 세로의 길이로 나눈다.(제시된 노란 사각형 넓이에 맞추기 위함이다.)
  • 위 과정을 갈색 사각형의 넓이가 총 카펫의 갯수에 일치할 때까지 반복한다.

최종 코드

function solution(brown, yellow) {
    const width = brown + yellow    
    let yellowHeight = 1        
    let yellowWidth = yellow    
    
    let brownHeight = yellowHeight + 2  
    let brownWidth = yellowWidth + 2    
    
    while((brownHeight * brownWidth) !== width) {
        yellowHeight += 1
        yellowWidth = yellow / yellowHeight
        brownHeight = yellowHeight + 2  
        brownWidth = yellowWidth + 2    
    }
    
    return [brownWidth, brownHeight]
}
profile
꾸준한 기록

0개의 댓글